Guide des développeurs pour les services de données Sun Cluster pour SE Solaris

Annexe B Liste des exemples de codes de service de données

Cette annexe fournit le code complet de chaque méthode du service de données échantillon, ainsi que le contenu du fichier d'enregistrement du type de ressources.

Cette annexe présente les programmes suivants :

Liste de code du fichier RTR

Le fichier RTR (Resource Type Registration) contient les déclarations de propriétés de ressource définissant la configuration initiale du service de données au moment ou l'administrateur du cluster enregistre ce service.


Exemple B–1 Fichier RTR SUNW.Sample

#
# Copyright (c) 1998-2004 by Sun Microsystems, Inc.
# Tous droits réservés.
#
# Données d'enregistrement du service de noms de domaine (DNS)
#
 
 
#pragma ident   “@(#)SUNW.sample   1.1   00/05/24 SMI”
 
RESOURCE_TYPE = “sample” ;
VENDOR_ID = SUNW ;
RT_DESCRIPTION = “Domain Name Service sur Sun Cluster” ;
 
RT_VERSION =”1.0” ; 
API_VERSION = 2 ;    
FAILOVER = TRUE ;
 
RT_BASEDIR =/opt/SUNWsample/bin ;
PKGLIST  = SUNWsample ;
 
START              = dns_svc_start ;
STOP               = dns_svc_stop ;
 
VALIDATE           = dns_validate ;
UPDATE             = dns_update ;
 
MONITOR_START      = dns_monitor_start ;
MONITOR_STOP       = dns_monitor_stop ;
MONITOR_CHECK      = dns_monitor_check ;
 
# Une liste des déclarations de propriétés de ressource entre crochets suit les
# déclarations du type de ressources. La déclaration du nom de propriété doit
# être le premier attribut suivant le crochet d'ouverture de chaque entrée.
#
 
# Les propriétés délai_exécution_<méthode> définissent le délai en secondes passé lequel
# le RGM conclut que l'appel de la méthode a échoué. 
 
# La valeur MIN du délai d'attente de toutes les méthodes est de 60 secondes. De cette manière,
# les administrateurs système ne peuvent pas définir de délais d'attente
# plus courts qui n'améliorent pas les performances de commutation/basculement et peuvent
# conduire le RGM à exécuter des actions non souhaitées (basculements erronés, réinitialisation de nœuds, basculement du groupe de ressources en mode
# to ERROR_STOP_FAILED) nécessitant l'intervention de l'opérateur. la configuration
# de délais d'attente trop courts induit une *diminution* de la disponibilité globale 
# du service de données.
{  
   PROPERTY = Start_timeout; 
   MIN=60; 
   DEFAULT=300;
}
 
{
             PROPERTY = Stop_timeout; 
            MIN=60; 
           DEFAULT=300;
}
{
        PROPERTY = Validate_timeout;
        MIN=60;
        DEFAULT=300;
}
{
         PROPERTY = Update_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Monitor_Start_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Monitor_Stop_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Thorough_Probe_Interval;
        MIN=1;
        MAX=3600;
        DEFAULT=60;
        TUNABLE = ANYTIME;
}
 
# Nombre de relance à effectuer pendant un intervalle de temps prédéterminé avant de 
# conclure qu'il est impossible de démarrer correctement l'application sur ce nœud.
{
         PROPERTY = Retry_Count;
        MIN=0;
        MAX=10;
        DEFAULT=2;
        TUNABLE = ANYTIME; 
}

# Définissez Intervalle_nouvelles_tentatives sur une valeur multiple de 60, ce paramètre
# configuré en secondes étant converti en minutes avec arrondissement au chiffre supérieur.
# Par exemple, 50 secondes est converti en 1 minute. Utilisez cette propriété pour 
# programmer le nombre de relances (Nombre_nouvelles_tentatives).
{
         PROPERTY = Retry_Interval;
        MIN=60;
        MAX=3600;
        DEFAULT=300;
        TUNABLE = ANYTIME;
}
 
{
        PROPERTY = Network_resources_used;
        TUNABLE = AT_CREATION;
        DEFAULT = ““ ;
}
 
#
# Propriété d'extension
#
 
# L'administrateur du cluster doit définir la valeur de cette propriété pour indiquer
# le répertoire contenant les fichiers de configuration utilisés par l'application.
# Pour cette application, DNS spécifie le chemin d'accès au fichier de configuration
# du service de noms de domaine sur le PXFS (en règle générale named.conf).
{
    PROPERTY = Confdir;
   EXTENSION;
   STRING;
   TUNABLE = AT_CREATION;
   DESCRIPTION = “Chemin du répertoire de configuration”;
}
 
# Délai d'attente en seconde avant de déclarer que la détection a échoué.
{
        PROPERTY = Probe_timeout;
        EXTENSION;
        INT;
        DEFAULT = 30;
        TUNABLE = ANYTIME;
        DESCRIPTION = “Délai pour la sonde (secondes)”;
}

Méthode Start

Le RGM appelle la méthode Start sur un nœud du cluster lorsque le groupe de ressources contenant la ressource du service de données est connecté à ce nœud ou lorsque la ressource est activée. Dans l'application échantillon, la méthode Start active le démon in.named (système de nom de domaine) sur ce nœud.


Exemple B–2 Méthode dns_svc_start

#!/bin/ksh
#
# Méthode de démarrage (Start) de HA-DNS.
#
# Cette méthode démarre le service de données sous le contrôle de la fonction PMF. Avant de démarrer
# le processus in.named du service de noms de domaine, elle exécute
# quelques contrôles "sanitaires". La balise de la fonction PMF pour le service de données est $RESOURCE_NAME.named.
# La fonction PMF tente de démarrer le service suivant un nombre de fois spécifié  (Retry_count) et si le nombre de tentatives
# est supérieur à cette valeur dans l'intervalle de temps spécifié (Retry_interval), la fonction PMF notifie 
# un échec au démarrage du service. Retry_count et Retry_interval sont des propriétés de l'ensemble des 
# ressources du fichier RTR.


#pragma ident   “@(#)dns_svc_start   1.1   00/05/24 SMI”

###############################################################################
# Analysez les arguments du programme.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Nom de la ressource DNS.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Nom du groupe de ressources dans lequel la ressource
                        # est configurée.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Nom du type de ressources.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;

                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “ERROR: Option $OPTARG unknown”
                     exit 1
                     ;;

                esac
        done

}




###############################################################################
# MAIN
#
##############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenez la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Analysez les arguments qui ont été transmis à cette méthode
parse_args “$@”

PMF_TAG=$RESOURCE_NAME.named
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

# Accédez à la valeur de la propriété Confdir de la ressource afin de démarrer le 
# service de noms de domaine. Entrez le nom de la ressource et le groupe de ressources,
# recherchez la valeur Confdir définie par l'administrateur du cluster lors de l'ajout de la ressource. 
config_info=scha_resource_get -O Extension -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME Confdir`
# scha_resource_get retourne le “type” et la “valeur” de la propriété d'extension.
# Accédez uniquement à la valeur de la propriété d'extension.
CONFIG_DIR=`echo $config_info | awk `{print $2}'`

# Vérifiez que $CONFIG_DIR est accessible.
if [ ! -d $CONFIG_DIR ]; then
   logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
       “${ARGV0} Directory $CONFIG_DIR missing or not mounted”
   exit 1
fi

# Configurez le répertoire $CONFIG_DIR si les fichiers de données contiennent
# des noms de chemin d'accès relatifs.
cd $CONFIG_DIR

# Vérifiez que le répertoire $CONFIG_DIR contient bien le fichier named.conf.
if [ ! -s named.conf ]; then
   logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
       “${ARGV0} File $CONFIG_DIR/named.conf is missing or empty”
   exit 1
fi

# Accédez à la valeur Retry_count à partir du fichier RTR.
RETRY_CNT=`scha_resource_get -O Retry_Count -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Accédez à la valeur Retry_interval à partir du fichier RTR. Convertissez cette valeur, à la base en
# secondes, en minutes pour le transfert vers pmfadm. Veuillez noter qu'il s'agit d'une conversion avec arrondissement :
# par exemple, 50 secondes devient 1 minutes.
((RETRY_INTRVAL = `scha_resource_get -O Retry_Interval -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ 60))

# Démarrez le démon in.named sous le contrôle de la fonction PMF. Laissez-le
# s'interrompre et redémarrer jusqu'à ce que la valeur $RETRY_COUNT dans l'intervalle $RETRY_INTERVAL soit atteinte. En cas d'autre échec,
# la fonction PMF cesse d'essayer de le redémarrer. Si un processus est déjà enregistré sous la balise 
# <$PMF_TAG>, la fonction PMF envoie un message d'alerte indiquant 
# que le processus est toujours opérationnel.
echo “Retry interval is “$RETRY_INTRVAL
pmfadm -c $PMF_TAG.named -n $RETRY_CNT -t $RETRY_INTRVAL \
    /usr/sbin/in.named -c named.conf

# Consignez un message indiquant que HA-DNS a démarré.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
           “${ARGV0} HA-DNS successfully started”
fi
exit 0

Méthode Stop

La méthode Stop est appelée sur un nœud du cluster lorsque le groupe de ressources contenant la ressource HA-DNS est déconnecté sur ce nœud ou que la ressource est désactivée. Cette méthode arrête le démon in.named (système de nom de domaine) sur ce nœud.


Exemple B–3 Méthode dns_svc_stop

#!/bin/ksh
#
# Méthode d'arrêt de HA-DNS
#
# Arrêtez le service de données à l'aide de la fonction PMF. Si le service ne fonctionne pas
# la méthode se ferme avec l'état 0, le retour de toute autre valeur basculant la ressource en mode 
# STOP_FAILED.


#pragma ident   “@(#)dns_svc_stop   1.1   00/05/24 SMI”

###############################################################################
# Annalysez les arguments du programme.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Nom de la ressource DNS.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Nom du groupe de ressources dans lequel la ressource
                        # est configurée.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Nom du type de ressources.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “ERROR: Option $OPTARG unknown”
                     exit 1
                     ;;
                esac
        done

}

###############################################################################
# MAIN
#
##############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenez la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Analysez les arguments qui ont été transmis à cette méthode
parse_args “$@”

PMF_TAG=$RESOURCE_NAME.named
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

# Obtenez la valeur Stop_timeout à partir du fichier RTR.
STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAMÈ

# Essayez d'arrêter le service de données de façon ordonnée à l'aide d'un signal SIGTERM
# au moyen de la fonction PMF. Attendez pendant 80% maximum de la valeur Stop_timeout pour
# voir si SIGTERM parvient à arrêter le service de données correctement. Dans le cas contraire, envoyez un signal SIGKILL
# pour arrêter le service de données. Utilisez jusqu'à 15% de la valeur Stop_timeout pour voir si 
# le signal SIGKILL offre les résultats escomptés. Dans le cas contraire, l'arrêt échoue et la méthode se ferme avec un état
# différent de zéro. Les 5% restant de Stop_timeout sont dédiés à une autre utilisation. 
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))

((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100))

# Vérifiez si in.named est exécuté. Le cas échéant, interrompez-le. 
if pmfadm -q $PMF_TAG.named; then 
   # Envoyez un signal SIGTERM au service de données et attendez pendant 80% de la
   # valeur totale du délai d'attente.
   pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM
   if [ $? -ne 0 ]; then 
      logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \
          “${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with \
           SIGKILL”
      
      # Comme le service de données ne s'est pas arrêté avec le signal SIGTERM, utilisez
      # le signal SIGKILL et attendez pendant 15% de la valeur totale du délai d'attente.
      pmfadm -s $PMF_TAG.named -w $HARD_TIMEOUT KILL
      if [ $? -ne 0 ]; then
          logger -p ${SYSLOG_FACILITY}.err -t [SYSLOG_TAG] \
          “${ARGV0} Failed to stop HA-DNS; Exiting UNSUCCESFUL”
          
          exit 1
      fi   
fi
else 
   # Le service de données n'est plus en cours d'exécution. Consignez un message et 
# quittez avec succès.
   logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \
           “HA-DNS is not started”

   # Même si HA-DNS n'est pas exécuté, quittez avec succès pour éviter de basculer
# le service de données en mode STOP_FAILED.
   exit 0
fi

# Le service de noms de domaine se ferme correctement. Consignez un message et quittez avec succès.
logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
    “HA-DNS successfully stopped”
exit 0

Utilitaire gettime

L'utilitaire gettime est un programme C utilisé par le programme PROBE pour suivre l'intervalle de temps entre les redémarrages de la détection. Vous devez compiler ce programme et le placer dans le même répertoire que les méthodes de rappel, c'est-à-dire, le répertoire indiqué dans la propriété RT_basedir.


Exemple B–4 Programme utilitaire gettime.c

# 
# Ce programme utilitaire, utilisé par la méthode de détection du service de données, suit 
# l'intervalle de temps en secondes à partir d'un point de référence connu (point de période). Vous 
# devez le compiler et le placer dans le même répertoire que les méthodes de rappel 
# du service de données (RT_basedir). 
#pragma ident “@(#)gettime.c 1.1 00/05/24 SMI” 

#include <stdio.h> 
#include <sys/types.h> 
#include <time.h> 

main()
 { 
      printf(“%d\n”, time(0)); 
      exit(0); 
}

Programme PROBE

Le programme PROBE vérifie la disponibilité du services de données à l'aide des commandes nslookup( 1M). La méthode de rappel Monitor_start lance ce programme et la méthode de rappel Monitor_stop l'arrête.


Exemple B–5 Programme dns_probe

#!/bin/ksh
#pragma ident   “@(#)dns_probe   1.1   00/04/19 SMI”
#
# Méthode de détection (Probe) de HA-DNS.
#
# Ce programme vérifie la disponibilité du service de données à l'aide de nslookup, qui 
# demande au serveur DNS de rechercher lui-même le serveur DNS. Si le serveur ne répond pas
# ou si un autre serveur répond à la requête, la méthode de détection conclut qu'il y a 
# un problème au niveau du service de données et bascule ce service sur un autre nœud du
# cluster. La détection est réalisée suivant un intervalle spécifique défini par 
# THOROUGH_PROBE_INTERVAL dans le fichier RTR. 
  
#pragma ident   “@(#)dns_probe   1.1   00/05/24 SMI”

###############################################################################
# Analysez les arguments du programme.
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Nom de la ressource DNS.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Nom du groupe de ressources dans lequel la ressource
                        # est configurée.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Nom du type de ressources.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “ERROR: Option $OPTARG unknown”
                     exit 1
                     ;;
                esac
        done
}

###############################################################################
# restart_service ()
#
# Cette fonction tente de redémarrer le service de données en appelant sa méthode 
# Stop, puis sa méthode Start. Si le service de données a déjà été 
# arrêté et qu'aucune balise n'est enregistrée pour ce service sous la fonction PMF,
# cette fonction bascule le service vers un autre nœud du cluster.
#
function restart_service
{
        # Pour redémarrer le service de données, commencez par vérifier qu'il 
        # est toujours enregistré sous la fonction PMF.
        pmfadm -q $PMF_TAG
        if [[ $? -eq 0 ]]; then
                # Comme la balise TAG du service de données est toujours enregistrée
                # sous la fonction PMF, commencez par arrêter le service de données, puis redémarrez-le.
                # Obtenez le nom de la méthode Stop et la valeur STOP_TIMEOUT
                # de cette ressource.
                STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
                STOP_METHOD=`scha_resource_get -O STOP \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
                hatimerun -t $STOP_TIMEOUT $RT_BASEDIR/$STOP_METHOD \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
                        -T $RESOURCETYPE_NAME

                if [[ $? -ne 0 ]]; then
                        logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                                “${ARGV0} Stop method failed.”
                        return 1
                fi

                # Obtenez le nom de la méthode Start et la valeur START_TIMEOUT
                # de cette ressource.
                START_TIMEOUT=`scha_resource_get -O START_TIMEOUT \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
                START_METHOD=`scha_resource_get -O START \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
                hatimerun -t $START_TIMEOUT $RT_BASEDIR/$START_METHOD \
                        -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
                        -T $RESOURCETYPE_NAME

                if [[ $? -ne 0 ]]; then
                        logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                                “${ARGV0} Start method failed.”
                        return 1
                fi

        else
                # L'absence de la balise TAG du service de données 
                # implique que ce service a déjà dépassé le nombre 
                # maximum de tentatives permises sous la fonction PMF. 
                # Par conséquent, ne retentez pas de redémarrer
                # le service de données. Essayez de le basculer 
                # sur un autre nœud du cluster.
                scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \
                        -R $RESOURCE_NAME
        fi

        return 0
}

###############################################################################
# decide_restart_or_failover ()
#
# Cette fonction décide de l'action à entreprendre suite à l'échec d'une détection : 
# redémarrez le service de données localement ou basculez-le sur un autre nœud du cluster.
#
function decide_restart_or_failover
{
   
   # Vérifiez s'il s'agit de la première tentative de redémarrage.
   if [ $retries -eq 0 ]; then
         # Il s'agit de la première tentative de redémarrage. Notez la durée 
         # de cette première tentative. 
         start_time=`$RT_BASEDIR/gettimè
         retries=`expr $retries + 1`
         # Comme il s'agit de la première tentative, tentez de redémarrer
         # le service de données.
         restart_service
         if [ $? -ne 0 ]; then
            logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                “${ARGV0} Failed to restart data service.”
            exit 1
         fi
   else
      # Ce n'est pas la première tentative
      current_time=`$RT_BASEDIR/gettimè
      time_diff=`expr $current_time - $start_timè
      if [ $time_diff -ge $RETRY_INTERVAL ]; then
         # Cet échec survient une fois la fenêtre de temps
         # écoulée. Réinitialisez le compteur de tentatives,
         # faites glisser la fenêtre et recommencez.
         retries=1
         start_time=$current_time
         # Comme l'échec précédent est survenu il y a plus de 
         # Retry_interval, tentez de redémarrer le service de données.
         restart_service
         if [ $? -ne 0 ]; then
            logger -p ${SYSLOG_FACILITY}.err \
                -t [$SYSLOG_TAG
                “${ARGV0} Failed to restart HA-DNS.”
            exit 1
         fi
      elif [ $retries -ge $RETRY_COUNT ]; then
         # Toujours dans la fenêtre de temps,
         # le compteur de tentative a expiré. Basculez.
         retries=0
         scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \
             -R $RESOURCE_NAME
         if [ $? -ne 0 ]; then
            logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                “${ARGV0} Failover attempt failed.”
            exit 1
         fi
      else
         # Toujours dans la fenêtre de temps,
         # le compteur de temps n'a pas expiré,
         # faites une autre tentative.
         retries=`expr $retries + 1`
         restart_service
         if [ $? -ne 0 ]; then
            logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                “${ARGV0} Failed to restart HA-DNS.”
            exit 1
         fi
      fi
fi
}

###############################################################################
# MAIN
###############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenez la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Analysez les arguments qui ont été transmis à cette méthode
parse_args “$@”

PMF_TAG=$RESOURCE_NAME.named
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

# L'intervalle suivant lequel la détection doit être effectuée est paramétré dans
# la propriété définie par le système THOROUGH_PROBE_INTERVAL.  
# Obtenez la valeur de cete propriété avec scha_resource_get 
PROBE_INTERVAL=scha_resource_get -O THOROUGH_PROBE_INTERVAL \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ

# Obtenez la valeur du délai d'attente autorisé pour la détection qui est définie 
# dans la propriété d'extension PROBE_TIMEOUT dans le fichier RTR. Le délai d'attente 
# par défaut de nslookup est de 1,5 minutes.
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}'`

# Identifiez le serveur sur lequel le service de noms de domaine fonctionne en obtenant
# la valeur de la propriété NETWORK_RESOURCES_USED de la ressource.
DNS_HOST=`scha_resource_get -O NETWORK_RESOURCES_USED -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Obtenez la valeur du compteur de tentative à partir de la propriété Retry_count définie par le système
RETRY_COUNT =`scha_resource_get -O RETRY_COUNT -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Obtenez la valeur de l'intervalle entre les tentatives à partir de la propriété Retry_interval définie par le système
RETRY_INTERVAL=scha_resource_get -O RETRY_INTERVAL -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Obtenez le chemin complet de l'utilitaire gettime à partir de la propriété  
# RT_basedir du type de ressources.
RT_BASEDIR=scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# La détection est exécutée dans une boucle sans fin, essayant les commandes nslookup. 
# Définissez un fichier temporaire pour les réponses de nslookup.
DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe
probefail=0
retries=0

while :
do
   # L'intervalle suivant lequel la détection doit être exécutée est spécifié dans la 
   # propriété THOROUGH_PROBE_INTERVAL. Cependant, définissez la durée 
   # <THOROUGH_PROBE_INTERVAL> pendant laquelle la détection est en sommeil.
   sleep $PROBE_INTERVAL

   # Exécutez la détection qui demande l'adresse IP sur laquelle
   # le service de noms de domaine fonctionne.
   hatimerun -t $PROBE_TIMEOUT /usr/sbin/nslookup $DNS_HOST $DNS_HOST \
           > $DNSPROBEFILE 2>&1
   
   retcode=$?
        if [ retcode -ne 0 ]; then
                probefail=1
        fi

   # Vérifiez que la réponse à la commande nslookup est émise par le serveur HA-DNS
   # et non par un autre serveur répertorié dans le fichier  
   # /etc/resolv.conf.
   if [ $probefail -eq 0 ]; then
      # Obtenez le nom du serveur qui a répondu à la requête de nslookup.
                   SERVER=` awk ` $1==”Server:” {print $2 }' \
                   $DNSPROBEFILE | awk -F. ` { print $1 } ` `
                if [ -z “$SERVER” ];
	                then
                        probefail=1
                else
                        if [ $SERVER != $DNS_HOST ]; then
                                probefail=1
                        fi
                fi
        fi

   # Si la variable probefail n'est pas définie sur 0, cela signifie que le délai de la commande nslookup
   # est dépassé ou que la réponse à la requête a été émise par un autre serveur
   # (spécifié dans le fichier /etc/resolv.conf). Dans les deux cas, le serveur DNS
   # ne répond pas et la méthode appelle decide_restart_or_failover,
   # qui détermine si le service de données doit être redémarré ou basculé
   # sur un autre nœud.

   if [ $probefail -ne 0 ]; then
         decide_restart_or_failover
   else
         logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
         “${ARGV0} Probe for resource HA-DNS successful”
   fi
done

Méthode Monitor_start

Cette méthode lance le programme PROBE du service de données.


Exemple B–6 Méthode dns_monitor_start

#!/bin/ksh
#
# Méthode de démarrage du détecteur HA-DNS.
#
# Cette méthode démarre le détecteur (probe) du service de données sous 
# le contrôle de la fonction PMF. Le détecteur est un processus qui teste le service de données
# suivants des intervalles réguliers et qui, en cas de problème,
# le redémarre sur le même nœud ou le bascule sur un autre nœud du cluster. 
# La balise PMF du détecteur est $RESOURCE_NAME.monitor.

#pragma ident   “@(#)dns_monitor_start   1.1   00/05/24 SMI”

###############################################################################
# Analysez les arguments du programme.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Nom de la ressource DNS.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Nom du groupe de ressources dans lequel la ressource
                        # est configurée.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Nom du type de ressources.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
          logger -p ${SYSLOG_FACILITY}.err \
                   -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “ERROR: Option $OPTARG unknown”
                     exit 1
                     ;;
                esac
        done

}

###############################################################################
# MAIN
#
##############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenez la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Analysez les arguments qui ont été transmis à cette méthode
parse_args “$@”

PMF_TAG=$RESOURCE_NAME.monitor
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

# Recherchez où réside la méthode de détection en obtenant la valeur de 
# la propriété RT_basedir du service de données.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Lancez la détection du service de données sous la fonction PMF. Utilisez l'option
# de tentative illimitée pour lancer la détection. Passez le nom de la ressource, 
# son groupe et son type à la méthode de détection. 
pmfadm -c $PMF_TAG.monitor -n -1 -t -1 \
    $RT_BASEDIR/dns_probe -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
    -T $RESOURCETYPE_NAME

# Consignez un message indiquant que le détecteur de HA-DNS a démarré.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
           “${ARGV0} Monitor for HA-DNS successfully started”
fi
exit 0 

Méthode Monitor_stop

Cette méthode interrompt le programme PROBE du service de données.


Exemple B–7 Méthode dns_monitor_stop

#!/bin/ksh
# Méthode d'arrêt du détecteur de HA-DNS
# Arrête le détecteur fonctionnant avec la fonction PMF.

#pragma ident   “@(#)dns_monitor_stop   1.1   00/05/24 SMI”

###############################################################################
# Analysez les arguments du programme.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Nom de la ressource DNS.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Nom du groupe de ressources dans lequel la ressource
                        # est configurée.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Nom du type de ressources.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “ERROR: Option $OPTARG unknown”
                     exit 1
                     ;;
                esac
        done
}

###############################################################################
# MAIN
#
##############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenez la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Analysez les arguments qui ont été transmis à cette méthode
parse_args “$@”

PMF_TAG=$RESOURCE_NAME.monitor
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

# Vérifiez si le détecteur fonctionne. Le cas échéant, interrompez-le. 
if pmfadm -q $PMF_TAG.monitor; then 
   pmfadm -s $PMF_TAG.monitor KILL
   if [ $? -ne 0 ]; then 
      logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
          “${ARGV0} Could not stop monitor for resource “ \
          $RESOURCE_NAME
           exit 1
   else
      # Possible d'arrêter le détecteur avec succès. Consignez un message.
      logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
          “${ARGV0} Monitor for resource “ $RESOURCE_NAME \
          “ successfully stopped”
   fi
fi
exit 0

Méthode Monitor_check

Cette méthode vérifie l'existence du répertoire spécifié par la propriété Confidr. Le RGM appelle Monitor_check chaque fois que la méthode PROBE bascule le service de données sur un nouveau nœud et contrôle les nœuds qui sont potentiellement des nœuds maîtres.


Exemple B–8 Méthode dns_monitor_check

#!/bin/ksh#
# Méthode de contrôle du détecteur du service de noms de domaine.
#
# Le RGM appelle cette méthode chaque fois que le système de détection
# des pannes bascule le service de données vers un nouveau nœud. Monitor_check appelle la méthode Validate pour vérifier
# que le répertoire et les fichiers de configuration sont disponibles sur le nouveau nœud.

#pragma ident   “@(#)dns_monitor_check 1.1   00/05/24 SMI”

###############################################################################
# Analysez les arguments du programme.
function parse_args # [args ...]
{
   typeset opt

   while getopts `R:G:T:' opt
   do
      case “$opt” in

      R)
      # Nom de la ressource DNS.
      RESOURCE_NAME=$OPTARG
      ;;

      G)
      # Nom du groupe de ressources dans lequel la ressource est
      # configurée.
      RESOURCEGROUP_NAME=$OPTARG
      ;;

      T)
      # Nom du type de ressources.
      RESOURCETYPE_NAME=$OPTARG
      ;;

      *)
      logger -p ${SYSLOG_FACILITY}.err \
      -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
      “ERROR: Option $OPTARG unknown”
      exit 1
      ;;
      esac
   done

}

###############################################################################
# MAIN
##############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenez la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Analysez les arguments qui ont été transmis à cette méthode.
parse_args “$@”

PMF_TAG=$RESOURCE_NAME.named
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

# Obtenez le nom complet de la méthode Validate à partir de la 
# propriété RT_BASEDIR du type de ressources.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Obtenez le nom de la méthode Validate de cette ressource.
VALIDATE_METHOD=`scha_resource_get -O VALIDATE -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Obtenez la valeur de la propriété Confdir afin de démarrer le
# service de données. Utilisez le nom de ressource et le groupe de ressources
# entrés pour obtenir la valeur Confdir définie au moment de l'ajout  de la ressource.
config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME Confdir`

# scha_resource_get renvoie le type et la valeur des propriétés d'extension.
# Utilisez awk pour obtenir uniquement la valeur de la propriété d'extension.
CONFIG_DIR=`echo $config_info | awk `{print $2}'`

# Appelez la méthode Validate pour pouvoir basculer le service de données
# vers le nouveau nœud.
$RT_BASEDIR/$VALIDATE_METHOD -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
-T $RESOURCETYPE_NAME -x Confdir=$CONFIG_DIR

# Consignez un message indiquant que le contrôle du détecteur a réussi.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
      “${ARGV0} Monitor check for DNS successful.”
   exit 0
else
   logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
      “${ARGV0} Monitor check for DNS not successful.”
   exit 1
fi

Méthode Validate

Cette méthode vérifie l'existence du répertoire spécifié par la propriété Confdir. Le RGM appelle cette méthode lorsque l'administrateur du cluster crée le service de données et met à jour ses propriétés. La méthode Monitor_check appelle cette méthode chaque fois que le système de détection des pannes bascule le service de données vers un nouveau nœud.


Exemple B–9 Méthode dns_validate

#!/bin/ksh
# Méthode Validate de HA-DNS.
# Cette méthode valide la propriété Confdir de la ressource. La méthode Validate 
# est appelée à la création et à la mise à jour de la ressource.
# A la création de la ressource, cette méthode est appelée avec 
# l'indicateur -c. En outre, toutes les propriétés définies par le système
# et d'extension sont passées en tant qu'arguments de la ligne de
# commande. Lorsqu'une propriété de ressource est mise à jour, la méthode Validate est appelée avec l'indicateur -u, et seule
# la paire propriété/valeur de la propriété mise à jour est passée en tant
# qu'argument de la ligne de commande. 
#
# exemple : si la ressource est en cours de création, les arguments de la ligne de commande sont 
#   
# dns_validate -c -R <..> -G <...> -T <..> -r <sysdef-prop=value>... 
#       -x <extension-prop=value>.... -g <resourcegroup-prop=value>....
#
# Si la propriété de ressource est en cours de mise à jour, les arguments sont 
#
# dns_validate -u -R <..> -G <...> -T <..> -r <sys-prop_being_updated=value>
#   OU
# dns_validate -u -R <..> -G <...> -T <..> -x <extn-prop_being_updated=value>

#pragma ident   “@(#)dns_validate   1.1   00/05/24 SMI”

###############################################################################
# Analysez les arguments du programme.
#
function parse_args # [args ...]
{
   typeset opt

   while getopts `cur:x:g:R:T:G:' opt
   do
                case “$opt” in
                R)
                        # Nom de la ressource DNS.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Nom du groupe de ressources dans lequel la ressource 
                        # est configurée.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Nom du type de ressources.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                r)      
                        # La méthode n'accède à aucune propriété définie par le 
                        # système, il s'agit donc d'un no-op.
                        ;;
                g)
                        # la méthode n'accède à aucune propriété de groupe de  
                        # ressources, il s'agit donc d'un no-op.
                        ;;
                c)
                        # Indique que la méthode Validate est appelée tandis que
                        # la ressource est en cours de création. Cet indicateur est donc un no-op.
                        ;;
                u)
                        # Indique la mise à jour d'une propriété lorsque la ressource
                        # existe déjà. Si la mise à jour concerne la propriété
                        # Confdir, celle-ci doit apparaître dans les arguments de la ligne de
                        # commande. Dans le cas contraire, la méthode doit rechercher
                        # spécifiquement cette propriété à l'aide de scha_resource_get.
                        UPDATE_PROPERTY=1
                        ;;
                x)
                        # Liste des propriétés d'extension. Séparez les paires 
                        # propriété/valeur en utilisant le séparateur “=”.
                        PROPERTY=`echo $OPTARG | awk -F= `{print $1}'`
                        VAL=echo $OPTARG | awk -F= `{print $2}'`

                        # Si la propriété d'extension onfdir figure sur la ligne de 
                        # commande, notez sa valeur. 
                        if [ $PROPERTY == “Confdir” ];
                        then
                        CONFDIR=$VAL
                        CONFDIR_FOUND=1
                        fi
                        ;;
                *)
                        logger -p ${SYSLOG_FACILITY}.err \
                        -t [$SYSLOG_TAG] \
                        “ERROR: Option $OPTARG unknown”
                        exit 1
                        ;;
                esac
   done
}

###############################################################################
# MAIN
#
##############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenez la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Définissez la valeur de CONFDIR comme étant Null. Ultérieurement, cette méthode recherche et extrait la valeur 
# de la propriété Confdir de la ligne de commande ou à l'aide de scha_resource_get.
CONFDIR=””
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

# Analysez les arguments qui ont été transmis à cette méthode.
parse_args “$@”

# Si la méthode de Validation est appelée du fait de la mise à jour des propriétés, 
# essayez de récupérer la valeur de la propriété d'extension Confdir à partir de la ligne de commande.
# Sinon, obtenez la valeur de Confdir avec scha_resource_get.
if ( (( $UPDATE_PROPERTY == 1 )) &&  (( CONFDIR_FOUND == 0 )) ); then
   config_info=scha_resource_get -O Extension -R $RESOURCE_NAME \
       -G $RESOURCEGROUP_NAME Confdir`
   CONFDIR=`echo $config_info | awk `{print $2}'`
fi

# Vérifiez que la propriété Confdir possède une valeur. Si elle n'en a pas, il en
# résulte un échec et une sortie avec l'état 1.
if [[ -z $CONFDIR ]]; then
   logger -p ${SYSLOG_FACILITY}.err \
       “${ARGV0} Validate method for resource “$RESOURCE_NAME “ failed”
   exit 1
fi

# Validez désormais la valeur réelle de la propriété Confdir. 

# Vérifiez que $CONFDIR est accessible.
if [ ! -d $CONFDIR ]; then
        logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
            “${ARGV0} Directory $CONFDIR missing or not mounted”
        exit 1
fi

# Vérifiez que le fichier named.conf figure dans le répertoire Confdir.
if [ ! -s $CONFDIR/named.conf ]; then
        logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
            “${ARGV0} File $CONFDIR/named.conf is missing or empty”
        exit 1
fi

# Consignez un message indiquant que la méthode Validate a réussi.
logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
   “${ARGV0} Validate method for resource “$RESOURCE_NAME \
   “ completed successfully”

exit 0

Méthode Update

Le RGM appelle la méthode Update pour notifier à une ressource en cours d'exécution que ses propriétés ont été modifiées.


Exemple B–10 Méthode dns_update

#!/bin/ksh
# Méthode de mise à jour de HA-DNS.
#
# La mise à jour réelle des propriétés est réalisée par le RGM. Les mises à jour affectent uniquement le système de détection des pannes. 
# Par conséquent, cette méthode doit redémarrer le système de détection des pannes.

#pragma ident   “@(#)dns_update   1.1   00/05/24 SMI”

###############################################################################
# Analyse des arguments du programme.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Nom de la ressource DNS.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Nom du groupe de ressources dans lequel la ressource
                        # est configurée.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Nom du type de ressources.
                        RESOURCETYPE_NAME=$OPTARG
                        ;; 
                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “ERROR: Option $OPTARG unknown”
                     exit 1
                     ;;
                esac
        done
}

###############################################################################
# MAIN
##############################################################################

export PATH=/bin:/usr/bin:/usr/cluster/bin:/usr/sbin:/usr/proc/bin:$PATH

# Obtenir la fonction syslog à utiliser pour consigner les messages.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Analyse des arguments qui ont été transmis à cette méthode
parse_args “$@”

PMF_TAG=$RESOURCE_NAME.monitor
SYSLOG_TAG=$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME

# Recherche où réside la méthode de détection en obtenant la valeur de  
# la propriété REP_BASE_TR du service de données.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Lorsque la méthode de Mise_à_jour est appelée, le RGM met à jour la valeur de la propriété en cours de mise à jour. 
# Cette méthode doit vérifier que le système de détection des pannes (sonde) fonctionne.  
# Le cas échéant, interrompez-le et redémarrez-le.
if pmfadm -q $PMF_TAG.monitor; then

# Interrompre le détecteur qui fonctionne déjà
        pmfadm -s $PMF_TAG.monitor TERM
        if [ $? -ne 0 ]; then
                logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                    “${ARGV0} Could not stop the monitor”
                exit 1
        else
                # Possible d'arrêter le service de noms de domaine avec succès.
                logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
                    “Monitor for HA-DNS successfully stopped”
        fi

   # Redémarrage du détecteur.
   pmfadm -c $PMF_TAG.monitor -n -1 -t -1 $RT_BASEDIR/dns_probe \
      -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME -T $RESOURCETYPE_NAME
   if [ $? -ne 0 ]; then
          logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                  “${ARGV0} Could not restart monitor for HA-DNS “
      exit 1
   else
      logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
                    “Monitor for HA-DNS successfully restarted”
   fi
fi
exit 0