cancel
Showing results for 
Search instead for 
Did you mean: 

dynamically instead of a fixed value in persistance

F5_LB_Eng
Cirrus
Cirrus

Hi ,

Any one has Irule for dynamically attribute  instead of a fixed value in persistance.

Does the builtin cookie persistence allows something like this:

Cookie_name: SESSIONID*

So can we set this more dynamically instead of a fixed value.

Thanks in advance

 

1 ACCEPTED SOLUTION

You can go with universal persistence (have universal persistence configured for your virtual server) and use the following iRule:

 

when RULE_INIT {
    set static::dynamic_persist_timeout 600
}
when HTTP_REQUEST {
    set http_cookie_list [HTTP::cookie names]
    if { [lsearch -glob $http_cookie_list "*_SESSIONID_*"] >= 0 } {
        set http_cookie_name [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]
        set http_cookie_value [HTTP::cookie value [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]]
        log local0. "cookiematch=${http_cookie_name},cookievalue=${http_cookie_value}"
        persist uie "${http_cookie_name}:${http_cookie_value}"
    }
}
when HTTP_RESPONSE {
    set http_cookie_list [HTTP::cookie names]
    if { [lsearch -glob $http_cookie_list "*_SESSIONID_*"] >= 0 } {
        set http_cookie_name [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]
        set http_cookie_value [HTTP::cookie value [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]]
        log local0. "cookiematch=${http_cookie_name},cookievalue=${http_cookie_value}"
        persist add uie "${http_cookie_name}:${http_cookie_value}" ${static::dynamic_persist_timeout}
    }
}

 

I tested this one in my environment using another BIG-IPs virtual server as a server emulation:

 

when HTTP_REQUEST {
    set http_cookie_list [HTTP::cookie names]
    if { [lsearch -glob $http_cookie_list "*_SESSIONID_*"] >= 0 } {
        set http_cookie_name [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]
        set http_cookie_value [HTTP::cookie value [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]]
        log local0. "cookiematch=${http_cookie_name},cookievalue=${http_cookie_value}"
    } else {
        if { [info exists http_cookie_name] } {
            unset http_cookie_name
        }
        if { [info exists http_cookie_value] } {
            unset http_cookie_value
        }
        for { set i 0 } { $i < 3 } { incr i } {
            append http_cookie_name [lindex {A B C D E F G H I J K L M N O P Q R S T U V W Z Y Z} [expr int(rand()*26)]]
        }
        append http_cookie_name "_SESSIONID_"
        for { set i 0 } { $i < 6 } { incr i } {
            append http_cookie_name [lindex {0 1 2 3 4 5 6 7 8 9} [expr int(rand()*10)]]
        }
        append http_cookie_name "_"
        for { set i 0 } { $i < 8 } { incr i } {
            append http_cookie_name [lindex {A B C D E F G H I J K L M N O P Q R S T U V W Z Y Z 0 1 2 3 4 5 6 7 8 9} [expr int(rand()*36)]]
        }
        for { set i 0 } { $i < 16 } { incr i } {
            append http_cookie_value [lindex {a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9} [expr int(rand()*36)]]
        }
        log local0. "cookiegenerator=${http_cookie_name},valuegenerator=${http_cookie_value}"
    }
    HTTP::respond 200 content "responder\r\n" noserver Connection Close Set-Cookie "${http_cookie_name}=${http_cookie_value}"
    return
}

You can monitor your persistence table on CLI of your device under test:

watch tmsh show ltm persist persist-records mode universal all-properties

 

View solution in original post

5 REPLIES 5

I´m not sure if I get your question right.

You are able to switch between persistence profiles in case they are of the same type as the default persistance profile of your virtual server.

You may use a Cookie Hash persistance profile in case your server sets a JSESSIONID cookie in its responses. This will be learned and if the client provides the cookie with the next request it will persist.

What is your exact use case?

You may use a Cookie Hash persistance profile in case your server sets a JSESSIONID cookie in its responses. This will be learned and if the client provides the cookie with the next request it will persist.

--- this is one i am looking  but cookied is abc_SESSIONID_<id>_<client>=HASH  , the cookie name itself is dynamic Which is the problem

You can go with universal persistence (have universal persistence configured for your virtual server) and use the following iRule:

 

when RULE_INIT {
    set static::dynamic_persist_timeout 600
}
when HTTP_REQUEST {
    set http_cookie_list [HTTP::cookie names]
    if { [lsearch -glob $http_cookie_list "*_SESSIONID_*"] >= 0 } {
        set http_cookie_name [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]
        set http_cookie_value [HTTP::cookie value [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]]
        log local0. "cookiematch=${http_cookie_name},cookievalue=${http_cookie_value}"
        persist uie "${http_cookie_name}:${http_cookie_value}"
    }
}
when HTTP_RESPONSE {
    set http_cookie_list [HTTP::cookie names]
    if { [lsearch -glob $http_cookie_list "*_SESSIONID_*"] >= 0 } {
        set http_cookie_name [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]
        set http_cookie_value [HTTP::cookie value [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]]
        log local0. "cookiematch=${http_cookie_name},cookievalue=${http_cookie_value}"
        persist add uie "${http_cookie_name}:${http_cookie_value}" ${static::dynamic_persist_timeout}
    }
}

 

I tested this one in my environment using another BIG-IPs virtual server as a server emulation:

 

when HTTP_REQUEST {
    set http_cookie_list [HTTP::cookie names]
    if { [lsearch -glob $http_cookie_list "*_SESSIONID_*"] >= 0 } {
        set http_cookie_name [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]
        set http_cookie_value [HTTP::cookie value [lindex $http_cookie_list [lsearch -glob $http_cookie_list "*_SESSIONID_*"]]]
        log local0. "cookiematch=${http_cookie_name},cookievalue=${http_cookie_value}"
    } else {
        if { [info exists http_cookie_name] } {
            unset http_cookie_name
        }
        if { [info exists http_cookie_value] } {
            unset http_cookie_value
        }
        for { set i 0 } { $i < 3 } { incr i } {
            append http_cookie_name [lindex {A B C D E F G H I J K L M N O P Q R S T U V W Z Y Z} [expr int(rand()*26)]]
        }
        append http_cookie_name "_SESSIONID_"
        for { set i 0 } { $i < 6 } { incr i } {
            append http_cookie_name [lindex {0 1 2 3 4 5 6 7 8 9} [expr int(rand()*10)]]
        }
        append http_cookie_name "_"
        for { set i 0 } { $i < 8 } { incr i } {
            append http_cookie_name [lindex {A B C D E F G H I J K L M N O P Q R S T U V W Z Y Z 0 1 2 3 4 5 6 7 8 9} [expr int(rand()*36)]]
        }
        for { set i 0 } { $i < 16 } { incr i } {
            append http_cookie_value [lindex {a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9} [expr int(rand()*36)]]
        }
        log local0. "cookiegenerator=${http_cookie_name},valuegenerator=${http_cookie_value}"
    }
    HTTP::respond 200 content "responder\r\n" noserver Connection Close Set-Cookie "${http_cookie_name}=${http_cookie_value}"
    return
}

You can monitor your persistence table on CLI of your device under test:

watch tmsh show ltm persist persist-records mode universal all-properties

 

F5_LB_Eng
Cirrus
Cirrus


abc_SESSIONID_<id>_<client>=HASH  , the cookie name itself is dynamic Which is the problem

 

F5_LB_Eng
Cirrus
Cirrus

Thank you stephan will check and update you