Configuración y Uso de Variables

Primero debe crear una variable y, a continuación, asignar un valor o especificar la operación que debe realizarse en la variable. Después de realizar estas operaciones, puede utilizar la asignación como acción de directiva.

Nota: Una vez configurada, la configuración de una variable no se puede modificar ni restablecer. Si es necesario cambiar la variable, se deben eliminar la variable y todas las referencias a la variable (expresiones y asignaciones). La variable se puede volver a agregar con nuevos ajustes, y las referencias (expresiones y asignaciones) se pueden volver a agregar.

Para configurar variables mediante la interfaz de línea de comandos

  1. Cree una variable.
add ns variable <name> -type <string> [-scope global] [-ifFull ( undef | lru )] [-ifValueTooBig ( undef | truncate )] [-ifNoValue ( undef | init )] [-init <string>] [-expires <positive_integer>] [-comment <string>]

Nota: Consulte la página man “man add ns variable” para la descripción de los parámetros del comando.

Ejemplo 1: Crear una variable ulong llamada “my_counter” e inicializarla en 1.

add ns variable my_counter –type ulong -init 1

Ejemplo 2: Cree un mapa denominado “user_privilege_map”. El mapa contendrá claves de longitud máxima 15 caracteres y valores de texto de longitud máxima 10 caracteres, con un máximo de 10000 entradas.

add ns variable user_privilege_map -type map(text(15),text(10),10000)

Nota: Si el mapa contiene 10000 entradas sin caducar, las asignaciones para claves nuevas reutilizan una de las entradas utilizadas menos recientemente. De forma predeterminada, una expresión que intenta obtener un valor para una clave inexistente inicializará un valor de texto vacío.

Asigne el valor o especifique la operación que se realizará en la variable. Esto se hace mediante la creación de una asignación.

add ns assignment <name> -variable <expression> [-set <expression> | -add <expression> | -sub <expression> | -append <expression> | -clear] [-comment <string>]

Nota: Se hace referencia a una variable mediante el selector de variables ($). Por lo tanto, $variable1 se utiliza para hacer referencia a variables de texto o ulong. Del mismo modo, $variable2[clave-expresión]se utiliza para hacer referencia a variables de mapa.

Ejemplo 1: Defina una asignación denominada “inc_my_counter” que agrega automáticamente 1 a la variable “my_counter”.

add ns assignment inc_my_counter -variable $my_counter -add 1

Ejemplo 2: defina una asignación denominada “set_user_privilege” que agregue a la variable “user_privilege_map” una entrada para la dirección IP del cliente con el valor devuelto por la llamada HTTP “get_user_privilege”.

add ns assignment set_user_privilege -variable $user_privilege_map[client.ip.src.typecast_text_t] -set sys.http.callout(get_user_privilege)

Nota: Si ya existe una entrada para esa clave, se reemplazará el valor. De lo contrario, se agregará una nueva entrada para la clave y el valor. Según la declaración anterior para user_privilege_map, si el mapa ya tiene 10000 entradas, una de las entradas utilizadas menos recientemente se reutilizará para la nueva clave y valor.

  1. Invocar la asignación de variable en una directiva.

    Hay dos funciones que pueden operar en variables de mapa.

    • $name.valueExists(key-expression). Devuelve true si hay un valor en el mapa seleccionado por la clave-expresión. De lo contrario, devuelve false. Esta función actualizará la información de caducidad y LRU si existe la entrada de mapa, pero no creará una nueva entrada de mapa si el valor no existe.

    • $name.valueCount. Devuelve el número de valores actualmente retenidos por la variable. Este es el número de entradas en un mapa. Para una variable singleton, esto es 0 si la variable no está inicializada o 1 de lo contrario.

    Ejemplo: invoque la asignación denominada “set_user_privilege” con una directiva de compresión.

add cmp policy set_user_privilege_pol -rule $user_privilege_map.valueExists(client.ip.src.typecast_text_t).not -resAction set_user_privilege

Use Case para insertar encabezado HTTP en el lado de respuesta

El siguiente ejemplo muestra un ejemplo de una variable singleton.

Agregue una variable singleton de texto de tipo. Esta variable puede contener un máximo de 100 bytes de datos.

add ns variable http_req_data -type text(100) -scope transaction

Agregue una acción de asignación, que se usará para almacenar los datos de solicitud HTTP en la variable.

add ns assignment set_http_req_data -variable $http_req_data -set http.req.body(100)

Agregue una acción de reescritura para insertar encabezado HTTP, cuyo valor se obtendrá de la variable.

add rewrite action act_ins_header insert_http_header user_name $http_req_data.after_str("user_name").before_str("password")

Agregue una directiva de reescritura que evaluará en el tiempo de solicitud y lleve a cabo una acción de asignación para almacenar datos. Cuando llegamos a esta directiva, tomaremos una acción de asignación y almacenaremos los datos en la variable ns (http_req_data)

add rewrite policy pol_set_variable true set_http_req_data

bind rewrite global pol_set_variable 10 -type req_dEFAULT

Agregue una directiva de reescritura que evaluará en el tiempo de respuesta y agregue un encabezado HTTP en la respuesta.

add rewrite policy pol_ins_header true act_ins_header

bind rewrite global pol_ins_header 10 -type res_dEFAULT

Acción de asignación

En un dispositivo Citrix ADC, una acción de asignación vinculada a la directiva se activa cuando la regla de directiva se evalúa como verdadera. La acción actualiza el valor de la variable que se puede utilizar en evaluaciones posteriores de reglas de directiva. De esta forma, la misma variable se puede actualizar y utilizar para las evaluaciones posteriores de directivas en la misma función. Anteriormente, el dispositivo ejecutaba acciones de asignación solo después de evaluar todas las directivas de la función cuando las directivas de las acciones de asignación asociadas se evaluaban como verdaderas. Por lo tanto, el valor de variable establecido por la acción de asignación no se puede utilizar en las evaluaciones posteriores de reglas de directiva dentro de la entidad.

Esta funcionalidad se puede entender mejor con un caso de uso que controla la lista de acceso de los clientes en un dispositivo Citrix ADC. La decisión de acceso es proporcionada por un servicio web separado, con la solicitudGET /client-access?<client-IP-address> que devuelve una respuesta con “BLOCK” o “Permitir” en el cuerpo. La llamada HTTP está configurada para incluir la dirección IP del cliente asociada a una solicitud entrante. Cuando el dispositivo Citrix ADC recibe una solicitud de un cliente, el dispositivo genera la solicitud de llamada y la envía al servidor de llamada, que aloja una base de datos de direcciones IP en la lista negra y un agente de llamada HTTP que comprueba si la dirección IP del cliente aparece en la base de datos. El agente de llamada HTTP recibe la solicitud de llamada, comprueba si aparece la dirección IP del cliente y envía una respuesta. La respuesta es un código de estado, 200, 302 junto con “BLOCK” o “Permitir” en el cuerpo. En función del código de estado, el dispositivo realiza la evaluación de directivas. Si la evaluación de la directiva es verdadera, la acción de asignación se activa inmediatamente y la acción establece el valor en la variable. El dispositivo utiliza y establece este valor de variable para la posterior evaluación de directivas en el mismo módulo.

Caso práctico para configurar la acción de asignación

Siga los pasos que se indican a continuación para configurar la acción de asignación y utilizar la variable para las directivas siguientes:

  1. La decisión de acceso es proporcionada por un servicio web separado, con la solicitud que devuelve una respuesta con BLOCK o Allow en el cuerpo.

    GET /url-service>/url-allowed?<URL path>

  2. Configure una variable de mapa para contener las decisiones de acceso de las URL.

    add ns variable url_list_map -type 'map(text(1000),text(10),10000)'

  3. Configure una llamada HTTP para enviar la solicitud de acceso al servicio web.

    add policy httpCallout url_list_callout -vserver url_vs -returnType TEXT -urlStemExpr '"/url-allowed?" + HTTP.REQ.URL.PATH' -resultExpr 'HTTP.RES.BODY(10)'

  4. Configure una acción de asignación para invocar la llamada para obtener la decisión de acceso y asignarla a la entrada de mapa para la URL.

    add ns assignment client_access_assn -variable '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T]' -set SYS.HTTP_CALLOUT(client_access_callout)

  5. Configure una acción de respuesta para enviar una respuesta 403 si se bloquea una solicitud de URL.

    add responder action url_list_block_act respondwith '"HTTP/1.1 403 Forbidden\\r\\n\\r\\n"'

  6. Configure una directiva de respuesta para establecer la entrada de mapa para la dirección URL si aún no está establecida. Con la mejora inmediata de la acción, el valor de entrada de mapa se establece cuando se evalúa esta directiva. Antes de la mejora, la asignación no se hizo hasta que todas las directivas de respuesta habían sido evaluadas decisión es proporcionada por un servicio web separado.

    add responder policy url_list_assn_pol '!$url_list_map.VALUEEXISTS(HTTP.REQ.URL.PATH)' url_list_assn

  7. Configure una directiva de respuesta para bloquear el acceso a una URL si su valor de entrada de mapa es BLOCK. Con la mejora inmediata de la acción, la entrada de mapa establecida por la directiva anterior está disponible para su uso en esta directiva. Antes de la mejora, la entrada del mapa todavía se desconfiguraría en este punto.

    add responder policy client_access_block_pol '$client_access_map[CLIENT.IP.SRC.TYPECAST_TEXT_T] == "BLOCK"' client_access_block_act

  8. Enlazar las directivas de Responder al servidor virtual. Nota: No podemos vincular globalmente las directivas porque no queremos ejecutarlas para la llamada HTTP en un servidor virtual independiente.

    bind lb vserver vs -policyName client_access_assn_pol -priority 10 -gotoPriorityExpression NEXT -type REQUEST bind lb vserver vs -policyName client_access_block_pol -priority 20 -gotoPriorityExpression END -type REQUEST

Para configurar variables mediante la utilidad de configuración

  1. Vaya a AppExpert > Variables NS, para crear una variable.
  2. Vaya a AppExpert > Asignaciones NS, para asignar valores a la variable.
  3. Desplácese hasta el área de entidad adecuada en la que quiera configurar la asignación como una acción.