Forum Discussion

swabbies_112156's avatar
swabbies_112156
Icon for Nimbostratus rankNimbostratus
Jan 24, 2012

Relational class or tables

We are running v9.4.8.

 

 

 

I am looking to create a relation based class, not sure if this is a function of a table in v10.

 

 

 

the relation is that I want a way to evaluate more than 1 criteria for a class in relation. I know I can create 2 classes and have the irule match both, but the problem I run into is that the group of users may not all match the group of commands to be matched on.

 

 

 

In the example below I want to match testsuser1 on commands 1 and 2, but testuser2 should only match on command2. It is not scalable to create multiple matching classes for every user as the list is dynamic and will be frequently updated via api. At times there could be 2 users or there could be 15 users. Same with commands.

 

 

 

class penatly_box {

 

"testuser1" "command1"

 

"testuser1" "command2"

 

"testuser1" "command2"

 

}'

 

 

 

 

Is there a function that exists to handle these relations?

 

 

 

 

 

 

 

15 Replies

  • The Irule is valid in terms of syntax but if the user is Testuser1 instead of testuser1, or the command is Command1 instead of command1 the log reports match and the pool is not hit.

     

  • Are your data group entries in all lower case? And does it log matched and go to the pool or log no match and not go to the penaltybox pool?

     

     

    Aaron
  • datagroup entries use only lower case. It logs "no match" and does not go to the penatly box pool. I also added in additional logging.

     

     

    I also added addtional logging and "Value 2" logs correctly when the URI values are lowercase. Value 2 logs nothing when the URI values use any uppercase.

     

     

    Start of changes

     

    log local0. "----------------------"

     

    log local0. "URI Information"

     

    log local0. "----------------------"

     

    log local0. "HTTP::uri: [HTTP::uri]"

     

    log local0. "----------------------"

     

    log local0. "Value1: [URI::query ?&[HTTP::query] &uid] "

     

    log local0. "----------------------"

     

    log local0. "Value2: [URI::query ?&[HTTP::query] &command] "

     

    log local0. "----------------------"

     

    log local0. "Path Information"

     

    log local0. "----------------------"

     

    log local0. "HTTP::path: [HTTP::path]"

     

    if {[matchclass [string tolower "[URI::query ?&[HTTP::query] &uid] [URI::query ?&[HTTP::query] &command]" ] equals test_penaltybox]}{

     

    pool test_penaltybox-80

     

    log local0. "matched"

     

    return

     

    } else {

     

    log local0. "no match"

     

    }
  • Sorry, URI::query is case sensitive. So you can try this instead:

     

     

    set query "&[string tolower [HTTP::query]]"

     

    if {[matchclass "[URI::query $query &uid] [URI::query $query &command]" equals test_penaltybox]}{

     

     

    Aaron
  • Thanks again Hoolio for pointing me in the right direction. After quite a bit of logging and failures I adjusted the query slightly and seem to be getting great results.

     

    I will update this after a bit of Q/A testing if there need to be any additional changes.

     

     

    Start of changes

     

    set testquery1 [ URI::query [string tolower [HTTP::uri]] command ]

     

    log local0. "----------------------"

     

    log local0. "testquery1:"

     

    log local0. "----------------------"

     

    log local0. "$testquery1"

     

    log local0. "----------------------"

     

    set testquery2 [ URI::query [string tolower [HTTP::uri]] uid ]

     

    log local0. "----------------------"

     

    log local0. "testquery2:"

     

    log local0. "----------------------"

     

    log local0. "$testquery2"

     

    log local0. "----------------------"

     

    if {[matchclass "[ URI::query [string tolower [HTTP::uri]] uid] [ URI::query [string tolower [HTTP::uri]] command ]" equals test_penaltybox]}{

     

    pool test_penaltybox-80

     

    log local0. "matched"

     

    return

     

    } else {

     

    log local0. "no match"

     

    }

     

    End of new changes