Esta sección describe las siguientes funciones que se emplean en todos los métodos de rellamada del servicio de datos de ejemplo:
La primera línea de una secuencia de órdenes del shell debe identificar el intérprete de éstas. Cada una de las secuencias de órdenes de los métodos del servicio de datos de ejemplo identifica el intérprete de órdenes como se indica a continuación:
#!/bin/ksh |
Todas las secuencias de órdenes del método de la aplicación de ejemplo exportan la ruta a los binarios y bibliotecas de Sun Cluster, en lugar de tener en cuenta la configuración de PATH del usuario.
####################################################################### # MAIN ####################################################################### export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH |
Todas las secuencias de órdenes del método (salvo Validate) utilizan pmfadm para iniciar (o detener) el servicio de datos o el supervisor, pasando el nombre del recurso. Cada secuencia de órdenes define una variable, PMF_TAG, que puede pasarse a pmfadm para identificar el servicio de datos o el supervisor.
Del mismo modo, cada secuencia de órdenes del método utiliza la orden logger para guardar los mensajes en el registro del sistema. Cada secuencia de órdenes define una variable, SYSLOG_TAG, que se puede pasar a logger con la opción -t para identificar el tipo de recurso, el grupo de recursos y el nombre de recurso del recurso para el que se está registrando el mensaje.
Todos los métodos definen SYSLOG_TAG del mismo modo, como muestra el ejemplo siguiente. Los métodos dns_probe, dns_svc_start, dns_svc_stop y dns_monitor_check definen PMF_TAG como se indica a continuación (la utilización de pmfadm y logger se produce desde el método dns_svc_stop):
######################################################################### # MAIN ######################################################################### PMF_TAG=$RESOURCE_NAME.named SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME # Enviar una señal SIGTERM al servicio de datos y esperar el 80% del # valor total del tiempo de espera. pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM if [ $? -ne 0 ]; then logger -p ${SYSLOG_FACILITY}.info \ -t [$SYSLOG_TAG] \ “${ARGV0} No se ha podido detener HA-DNS con SIGTERM; \ Reitentar con SIGKILL” |
Los métodos dns_monitor_start, dns_monitor_stop y dns_update definen PMF_TAG como se indica a continuación (la utilización de pmfadm se realiza desde el método dns_monitor_stop):
######################################################################### # MAIN ######################################################################### PMF_TAG=$RESOURCE_NAME.monitor SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME ... # Verificar si el supervisor está en ejecución; si así fuera, detenerlo. if pmfadm -q $PMF_TAG.monitor; then pmfadm -s $PMF_TAG.monitor KILL |
RGM invoca todos los métodos de rellamada, salvo Validate, como se indica a continuación.
nombre_método -R nombre_recurso -T nombre_tipo_recurso -G nombre_grupo_recurso |
El nombre del método es el de la ruta del programa que implementa el método de rellamada. Un servicio de datos especifica el nombre de la ruta de cada método en el archivo RTR. Estos nombres de ruta son relativos al directorio especificado por la propiedad Rt_basedir también en el archivo RTR. Por ejemplo, en el archivo RTR del servicio de datos de ejemplo, los nombres del directorio básico y del método se especifican como se indica a continuación.
RT_BASEDIR=/opt/SUNWsample/bin; START = dns_svc_start; STOP = dns_svc_stop; ... |
Todos los argumentos del método de rellamada se pasan como valores con indicadores, donde -R indica el nombre de la instancia de recursos, -T, el tipo del recurso y -G, el grupo en el que se configura el recurso. Consulte la página de comando man rt_callbacks(1HA) para obtener más información sobre los métodos de rellamada.
El método Validate se invoca con argumentos adicionales (los valores de la propiedad del recurso y del grupo de recursos en el que se invoca). Consulte Manejo de las actualizaciones de propiedades para obtener más información.
Cada método de rellamada necesita una función para analizar los argumentos que se le pasan. Dado que las rellamadas pasan siempre por los mismos argumentos, el servicio de datos proporciona una única función de análisis para todas las rellamadas de la aplicación.
A continuación se muestra la función parse_args() empleada para los métodos de rellamada en la aplicación de ejemplo.
######################################################################### # Analizar argumentos del programa. # function parse_args # [args ...] { typeset opt while getopts 'R:G:T:' opt do case "$opt" in R) # Nombre del recurso de DNS. RESOURCE_NAME=$OPTARG ;; G) # Nombre del grupo de recursos en el que se ha configurado # el recurso. RESOURCEGROUP_NAME=$OPTARG ;; T) # Nombre del tipo de recurso. RESOURCETYPE_NAME=$OPTARG ;; *) logger -p ${SYSLOG_FACILITY}.err \ -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \ "ERROR: Opción $OPTARG desconocida" exit 1 ;; esac done } |
Aunque el método PROBE de la aplicación de ejemplo está definido por el usuario (no es un método de rellamada de Sun Cluster), se invoca con los mismos argumentos que los métodos de rellamada. Por tanto, este método contiene una función de análisis idéntica a la que utilizan otros métodos de rellamada.
La función de análisis se invoca en MAIN como:
parse_args “$@” |
Se recomienda que los métodos de rellamada utilicen la función syslog para enviar mensajes de error a los usuarios finales. Todos los métodos de rellamada del servicio de datos de ejemplo utilizan la función scha_cluster_get() para recuperar el número del recurso syslog utilizado para el registro del clúster, como se indica a continuación:
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` |
El valor se almacena en una variable del shell, SYSLOG_FACILITY, y se puede utilizar como el recurso de la orden logger para guardar mensajes en un registro del clúster. Por ejemplo, el método Start del servicio de datos de ejemplo recupera el recurso syslog y registra un mensaje que indica que el servicio de datos se ha iniciado, como se muestra a continuación:
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY` ... if [ $? -eq 0 ]; then logger -p ${SYSLOG_FACILITY}.err \ -t [$SYSLOG_TAG] \ "${ARGV0} HA-DNS iniciado satisfactoriamente" fi |
Consulte la página de comando man scha_cluster_get(1HA) para obtener más información.
La mayoría de los métodos de rellamada necesitan obtener información sobre las propiedades de recurso y el tipo de recurso del servicio de datos. La API proporciona la función scha_resource_get() con este fin.
Hay dos tipos disponibles de propiedades de recurso: propiedades definidas por el sistema y propiedades de extensión; aquellas están predefinidas; éstas se definen en el archivo RTR.
Cuando se usa scha_resource_get() para obtener el valor de una propiedad definida por el sistema, se especifica el nombre de ésta con el parámetro -O. La orden sólo devuelve el valor de la propiedad. Por ejemplo, en el servicio de datos de ejemplo, el método Monitor_start necesita ubicar el programa de análisis para poder ejecutarlo; éste reside en el directorio básico del servicio de datos, señalado por la propiedad RT_BASEDIR. De esta manera el método Monitor_start recupera el valor de RT_BASEDIR y lo sitúa en la variable RT_BASEDIR como se muestra a continuación.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME -G \ $RESOURCEGROUP_NAME` |
Las propiedades de extension se deben especificar con la opción -O e indicar el nombre de la propiedad como el último parámetro. Para estas propiedades, la orden devuelve el tipo y el valor de la propiedad. Por ejemplo, en el servicio de datos de ejemplo, el programa de análisis recupera el tipo y el valor de la propiedad de extensión probe_timeout y después usa awk para poner el valor sólo en la variable del shell PROBE_TIMEOUT como se muestra a continuación.
probe_timeout_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \ -G $RESOURCEGROUP_NAME Probe_timeout` PROBE_TIMEOUT=`echo $probe_timeout_info | awk '{print $2}'` |