Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Anhang B Codeauflistungen für Beispieldatendienste

Dieser Anhang enthält den vollständigen Code für jede Methode im Beispieldatendienst. Daneben listet er den Inhalt der Ressourcentyp-Registrierungsdatei auf.

Der Anhang enthält die folgenden Codeauflistungen.

Auflistung der Ressourcentyp-Registrierungsdatei

Die RTR-Datei (Resource Type Registration, Ressourcentypregistrierung) enthält die Deklarationen der Ressourcen- und Ressourcentypeigenschaften, welche die anfängliche Konfiguration des Datendienstes zu dem Zeitpunkt definieren, an dem der Cluster-Verwalter den Datendienst registriert.


Beispiel B–1 SUNW.Sample-RTR-Datei

#
# Copyright (c) 1998-2004 Sun Microsystems, Inc.
# Alle Rechte vorbehalten.
#
# Registrierungsinformationen für DNS (Domain Name Service)
#
 
 
#pragma ident   “@(#)SUNW.sample   1.1   00/05/24 SMI”
 
RESOURCE_TYPE = “Beispiel”;
VENDOR_ID = SUNW;
RT_DESCRIPTION = “DNS (Domain Name Service) auf 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;
 
# Eine Liste der Ressourceneigenschaftsdeklarationen in Klammern folgt auf die
# Ressourcentypdeklarationen. Die Eigenschaftsnamensdeklaration muss das
# erste Attribut nach der geöffneten geschweiften Klammer für jeden Eintrag sein.
#
 
# Die <Methoden>_timeout-Eigenschaften stellen den Wert in Sekunden ein,
# nach dem RGM annimmt, dass der Aufruf der Methode fehlgeschlagen ist.
 
# Der MIN-Wert für alle Methoden-Zeitüberschreitungen ist auf 60 Sekunden
# eingestellt. Dies verhindert, dass die Verwalter kürzere Zeitüberschreitungen
# einstellen, mit denen die Switchover-/Failover-Leistung nicht verbessert wird
# und die zu unerwünschten RGM-Aktionen führen können (falsche Failover,
# Knotenneustart oder Verschieben der Ressourcengruppe in den ERROR_STOP_FAILED-Zustand, was
# einen Bedienereingriff erforderlich macht). Wenn zu kurze Methoden-Zeitüberschreitungen
# eingestellt werden, führt dies zu einem *Absinken* der allgemeinen
# Verfügbarkeit des Datendienstes.
{
   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;
}
 
# Die Anzahl der auszuführenden Wiederholungen innerhalb eines bestimmten
# Zeitraums, bevor angenommen wird, dass die Anwendung auf diesem Knoten nicht
# erfolgreich gestartet werden kann.
{
        PROPERTY = Retry_Count;
        MIN=0;
        MAX=10;
        DEFAULT=2;
        TUNABLE = ANYTIME;
}

# Stellen Sie Retry_Interval als ein Vielfaches von 60 ein, da es von
# Sekunden in Minuten konvertiert wird und aufrundet. Ein Wert von 50 (Sekunden)
# wird z. B. zu einer Minute konvertiert. Verwenden Sie diese Eigenschaft, um die
# Anzahl der Wiederholungen einzustellen (Retry_Count).

{
        PROPERTY = Retry_Interval;
        MIN=60;
        MAX=3600;
        DEFAULT=300;
        TUNABLE = ANYTIME;
}
 
{
        PROPERTY = Network_resources_used;
        TUNABLE = AT_CREATION;
        DEFAULT = ““;
}
 
#
# Erweiterungseigenschaften
#
 
# Der Cluster-Verwalter muss den Wert dieser Eigenschaft so einstellen, dass
# er auf das Verzeichnis mit den von der Anwendung verwendeten Konfigurationsdateien
# zeigt. Geben Sie für diese Anwendung, DNS, den Pfad der DNS-Konfigurationsdatei
# auf PXFS an (in der Regel named.conf).
{
   PROPERTY = Confdir;
   EXTENSION;
   STRING;
   TUNABLE = AT_CREATION;
   DESCRIPTION = “Konfigurationsverzeichnispfad”;
}
 
# Zeitüberschreitungswert in Sekunden, bevor das Testsignal als fehlgeschlagen
# deklariert wird.
{
        PROPERTY = Probe_timeout;
        EXTENSION;
        INT;
        DEFAULT = 30;
        TUNABLE = ANYTIME;
        DESCRIPTION = “Zeitüberschreitungswert für das Testsignal (Sekunden)”;
}

Start-Methode

RGM ruft die Start-Methode auf einem Cluster-Knoten auf, wenn die Ressourcengruppe, welche die Datendienstressource enthält, auf diesem Knoten online gebracht wird bzw. wenn die Ressource aktiviert wird. In der Beispielanwendung aktiviert die Start-Methode den in.named (DNS)-Dämon auf diesem Knoten.


Beispiel B–2 dns_svc_start-Methode

#!/bin/ksh
#
# Start-Methode für HA-DNS.
#
# Diese Methode startet den Datendienst unter der Steuerung von PMF.
# Vor dem Starten des in.named-Prozesses für DNS werden einige Kontrollprüfungen
# ausgeführt. Die PMF-Markierung für den Datendienst ist $RESOURCE_NAME.named.
# PMF versucht eine angegebene Anzahl von Malen (Retry_count), den Dienst zu starten.
# Wenn die Anzahl der Versuche diesen Wert innerhalb eines bestimmten Zeitintervalls
# (Retry_interval) überschreitet, berichtet PMF, dass der Start des Dienstes
# fehlgeschlagen ist. Sowohl Retry_count als auch Retry_interval sind Eigenschaften
# der in der RTR-Datei eingestellten Ressource.


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

###############################################################################
# Programmargumente analysieren.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Name der DNS-Ressource
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Name der Ressourcengruppe, in der die Ressource
                        # konfiguriert ist.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Name des Ressourcentyps.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;

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

                esac
        done

}




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

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

# syslog-Funktion abrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Argumente analysieren, die an diese Methode übergeben wurden
parse_args “$@”

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

# Wert der Confdir-Eigenschaft der Ressource abrufen, um DNS zu starten.
# Unter Verwendung des eingegebenen Ressourcennamens und der Ressourcengruppe
# wird der Wert von Confdir gesucht. Dieser Wert wird vom Cluster-Verwalter
# eingestellt, wenn er die Ressource hinzufügt.
config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME Confdir`
# scha_resource_get gibt sowohl den “Typ” als auch den
# “Wert” der Erweiterungseigenschaften
# zurück. Nur den Wert der Erweiterungseigenschaft abrufen.
CONFIG_DIR=`echo $config_info | awk `{print $2}'`

# Prüfen, ob der Zugriff auf $CONFIG_DIR möglich ist.
if [ ! -d $CONFIG_DIR ]; then
   logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
       “${ARGV0} Verzeichnis $CONFIG_DIR fehlt oder nicht eingehängt”
   exit 1
fi

# Zum Verzeichnis $CONFIG_DIR wechseln, falls die Datendateien relative
# Pfadnamen enthalten.
cd $CONFIG_DIR

# Prüfen, ob die named.conf-Datei im Verzeichnis $CONFIG_DIR vorhanden ist.
if [ ! -s named.conf ]; then
   logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
       “${ARGV0} Datei $CONFIG_DIR/named.conf fehlt oder ist leer”
   exit 1
fi

# Wert für Retry_count aus der RTR-Datei abrufen.
RETRY_CNT=`scha_resource_get -O Retry_Count -R $RESOURCE_NAME \
-G  $RESOURCEGROUP_NAMÈ

# Wert für Retry_interval aus der RTR-Datei abrufen. Dieser Wert in
# Sekunden wird für die Weitergabe an pmfadm in Minuten konvertiert.
# Beachten Sie, dass bei dieser Konvertierung gerundet wird, so
# dass z. B. 50 Sekunden auf eine Minute gerundet werden.

((RETRY_INTRVAL = `scha_resource_get -O Retry_Interval -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ 60))

# in.named-Dämon unter Steuerung von PMF starten. Bis zu
# $RETRY_COUNT Male in einem Zeitraum von $RETRY_INTERVAL abstürzen lassen
# und neu starten; wenn er öfter abstürzt, versucht PMF keinen
# Neustart mehr. Wenn bereits ein Prozess unter der Markierung
# <$PMF_TAG> registriert ist, dann sendet PMF eine Warnmeldung,
# dass der Prozess bereits läuft.
echo “Wiederholungsintervall ist “$RETRY_INTRVAL
pmfadm -c $PMF_TAG.named -n $RETRY_CNT -t $RETRY_INTRVAL \
    /usr/sbin/in.named -c named.conf

# Meldung protokollieren, die angibt, dass HA-DNS gestartet wurde.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\
           “${ARGV0} HA-DNS wurde erfolgreich gestartet”
fi
exit 0 

Stop-Methode

Die Stop-Methode wird auf einem Cluster-Knoten aufgerufen, wenn die Ressourcengruppe, welche die HA-DNS-Ressource enthält, auf diesem Knoten offline gebracht bzw. wenn die Ressource deaktiviert wird. Diese Methode stoppt den in.named (DNS)-Dämon auf dem Knoten.


Beispiel B–3 dns_svc_stop-Methode

#!/bin/ksh
#
# Stopp-Methode für HA-DNS
#
# Stoppt den Datendienst mithilfe von PMF. Wenn der Dienst nicht läuft, wird die
# Methode mit Status 0 beendet, da die Rückgabe eines anderen Wertes die
# Ressource in STOP_FAILED-Zustand versetzt.


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

###############################################################################
# Programmargumente analysieren.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Name der DNS-Ressource.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Name der Ressourcengruppe, in der die Ressource
                        # konfiguriert ist.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Name des Ressourcentyps.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;

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

}

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

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

# syslog-Funktion aufrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Argumente analysieren, die an diese Methode übergeben wurden
parse_args “$@”

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

# Stop_timeout-Wert aus der RTR-Datei abrufen.
STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAMÈ

# Versuchen, den Datendienst unter Verwendung eines SIGTERM
# -Signals über PMF ordnungsgemäß zu stoppen. Bis zu 80% des Stop_timeout-Werts
# warten, um zu sehen, ob SIGTERM den Datendienst erfolgreich stoppen kann. Andernfalls
# SIGKILL senden, um den Datendienst zu stoppen. Bis zu 15% des Stop_timeout-Wertes
# warten, um zu sehen, ob SIGKILL erfolgreich ist. Andernfalls ist ein Fehlschlag
# aufgetreten, und die Methode wird in einem Nicht-Null-Status beendet.
# Die restlichen 5% von Stop_timeout werden für andere Zwecke verwendet.
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))

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

# Überprüfen, ob in.named läuft. Falls ja, Abbruch erzwingen.
if pmfadm -q $PMF_TAG.named; then
   # SIGTERM-Signal an den Datendienst senden und bis zu 80% des
   # gesamten Zeitüberschreitungswertes warten.
   pmfadm -s $PMF_TAG.named -w $SMOOTH_TIMEOUT TERM
   if [ $? -ne 0 ]; then
      logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \
          “${ARGV0} HA-DNS konnte nicht mit SIGTERM gestoppt werden; Wiederholen mit \
           SIGKILL”

      # Da der Datendienst mit einem SIGTERM-Signal nicht gestoppt wurde,
      # jetzt SIGKILL verwenden und nochmals 15% des gesamten
      # Zeitüberschreitungswertes warten.
      pmfadm -s $PMF_TAG.named -w $HARD_TIMEOUT KILL
      if [ $? -ne 0 ]; then
          logger -p ${SYSLOG_FACILITY}.err -t [SYSLOG_TAG] \
          “${ARGV0} HA-DNS konnte nicht gestoppt werden; Beenden OHNE ERFOLG”

          exit 1
      fi
fi
else
   # Der Datendienst läuft nun nicht mehr. Meldung protokollieren und
   # mit Erfolg beenden.
   logger -p ${SYSLOG_FACILITY}.info -t [SYSLOG_TAG] \
           “HA-DNS ist nicht gestartet”

   # Auch wenn HA-DNS nicht läuft, wird mit Erfolg beendet, damit der Datendienst
   # nicht in einen STOP_FAILED-Zustand versetzt wird.

   exit 0
fi

# DNS erfolgreich gestoppt. Meldung protokollieren und mit Erfolg beenden.
logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
    “HA-DNS erfolgreich gestoppt”
exit 0

gettime-Dienstprogramm

Das gettime-Dienstprogramm ist ein C-Programm, das vom PROBE-Programm zur Verfolgung der verstrichenen Zeit zwischen den Neustarts des Testsignals verwendet wird. Sie müssen dieses Programm kompilieren und im gleichen Verzeichnis wie die Rückmeldemethoden ablegen, also in dem Verzeichnis, auf das die RT_basedir -Eigenschaft zeigt.


Beispiel B–4 gettime.c-Dienstprogramm

#
# Dieses Dienstprogramm, das von der Testsignal-Methode des Datendienstes verwendet wird,
# verfolgt die verstrichene Zeit in Sekunden ab einem bekannten Referenzpunkt (Epoch-Punkt).
# Es muss kompiliert und in demselben Verzeichnis wie die Rückmeldemethoden
# des Datendienstes abgelegt werden (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);
}

PROBE-Programm

Das PROBE-Programm prüft die Verfügbarkeit des Datendienstes mithilfe von nslookup( 1M)-Befehlen. Die Rückmeldemethode Monitor_start startet dieses Programm, und die Rückmeldemethode Monitor_start stoppt es.


Beispiel B–5 dns_probe-Programm

#!/bin/ksh
#pragma ident   “@(#)dns_probe   1.1   00/04/19 SMI”
#
#Testsignal-Methode für HA-DNS.
#
# Dieses Programm prüft die Verfügbarkeit des Datendienstes mithilfe von
# nslookup, das den DNS-Server auffordert, selbst nach dem DNS-Server zu suchen. Wenn
# der Server nicht antwortet bzw. die Abfrage von einem anderen Server beantwortet wird,
# schließt der Test, dass ein Problem mit dem Datendienst aufgetreten ist,
# und führt ein Failover auf einen anderen Knoten im Cluster durch. Die Testsignale
# werden in bestimmten Intervallen gesendet, eingestellt durch THOROUGH_PROBE_INTERVAL
# in der RTR-Datei.
  
#pragma ident   “@(#)dns_probe   1.1   00/05/24 SMI”

###############################################################################
# Programmargumente analysieren.
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Name der DNS-Ressource.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Name der Ressourcengruppe, in der die Ressource
                        # konfiguriert ist.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Name des Ressourcentyps.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “FEHLER: Option $OPTARG unbekannt”
                     exit 1
                     ;;
                esac
        done
}

###############################################################################
# restart_service ()
#
# Diese Funktion versucht, den Datendienst durch Aufruf der Stopp-Methode,
# gefolgt von der Start-Methode des Datendienstes neu zu starten. Wenn der
# Datendienst bereits beendet wurde und keine Markierung für den Datendienst
# unter PMF registriert wurde, führt diese Funktion ein Failover für den Dienst
# auf einen anderen Knoten im Cluster aus.
#
function restart_service
{
        # Zum Neustarten des Datendienstes zunächst überprüfen,
        # ob der Datendienst selbst noch unter PMF registriert ist.
        pmfadm -q $PMF_TAG
        if [[ $? -eq 0 ]]; then
                # Da das TAG für den Datendienst noch unter PMF registriert
                # ist, zuerst den Datendienst stoppen und dann wieder neu starten..
                # Stopp-Methodenname und STOP_TIMEOUT-Wert für
                # diese Ressource abrufen.
                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} Stopp-Methode fehlgeschlagen.”
                        return 1
                fi

                # Start-Methodenname und START_TIMEOUT-Wert für
                # diese Ressource abrufen.
                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-Methode fehlgeschlagen.”
                        return 1
                fi

        else
                # Das Fehlen des TAG für den Datendienst
                # weist darauf hin, dass der Datendienst bereits die
                # unter PMF zulässigen Wiederholungen überschritten hat.
                # Es wird also nicht versucht, den Datendienst noch einmal
                # neu zu starten, sondern ein Failover auf
                # einen anderen Knoten im Cluster auszuführen.
                scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \
                        -R $RESOURCE_NAME
        fi

        return 0
}

###############################################################################
# decide_restart_or_failover ()
#
# Diese Funktion legt fest, welche Aktion bei Fehlschlagen eines Testsignals
# auszuführen ist: lokaler Neustart des Datendienstes oder Failover auf einen
# anderen Knoten im Cluster.
#
function decide_restart_or_failover
{

   # Prüfen, ob dies der erste Neustartversuch ist.
   if [ $retries -eq 0 ]; then
         # Dies ist der erste Fehlschlag. Zeit für diesen
         # ersten Versuch festhalten.
         start_time=`$RT_BASEDIR/gettimè
         retries=`expr $retries + 1`
         # Da es sich um den ersten Fehlschlag handelt, versuchen,
         # den Datendienst neu zu starten.
         restart_service
         if [ $? -ne 0 ]; then
            logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                “${ARGV0} Datendienst konnte nicht neu gestartet werden.”
            exit 1
         fi
   else
      # Dies ist nicht der erste Fehlschlag
      current_time=`$RT_BASEDIR/gettimè
      time_diff=`expr $current_time - $start_timè
      if [ $time_diff -ge $RETRY_INTERVAL ]; then
         # Dieser Fehlschlag ist aufgetreten, nachdem das Zeitfenster
         # verstrichen war. Daher den Wiederholungszähler zurücksetzen,
         # das Intervall verschieben und eine Wiederholung ausführen.
         retries=1
         start_time=$current_time
         # Da der letzte Fehlschlag vor mehr als Retry_interval
         # auftrat, versuchen, den Datendienst neu zu starten.
         restart_service
         if [ $? -ne 0 ]; then
            logger -p ${SYSLOG_FACILITY}.err \
                -t [$SYSLOG_TAG
                “${ARGV0} HA-DNS konnte nicht neu gestartet werden.”
            exit 1
         fi
      elif [ $retries -ge $RETRY_COUNT ]; then
         # Noch innerhalb des Zeitintervalls, und der
         # Wiederholungszähler ist abgelaufen, also Failover.
         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-Versuch fehlgeschlagen.”
            exit 1
         fi
      else
         # Noch innerhalb des Zeitintervalls, und der
         # Wiederholungszähler ist nicht abgelaufen.
         # Also wird eine weitere Wiederholung ausgeführt.
         retries=`expr $retries + 1`
         restart_service
         if [ $? -ne 0 ]; then
            logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                “${ARGV0} HA-DNS konnte nicht neu gestartet werden.”
            exit 1
         fi
      fi
fi
}

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

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

# syslog-Funktion abrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Argumente analysieren, die an diese Methode übergeben wurden
parse_args “$@”

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

# Das Intervall, in dem die Testsignale gesendet werden, ist in der systemdefinierten
# Eigenschaft THOROUGH_PROBE_INTERVAL eingestellt. Den Wert dieser Eigenschaft mit
# scha_resource_get abrufen
PROBE_INTERVAL=`scha_resource_get -O THOROUGH_PROBE_INTERVAL \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ

# Zeitüberschreitungswert abrufen, der für das Testsignal zulässig ist.
# Dieser ist in der Erweiterungseigenschaft PROBE_TIMEOUT in der RTR-Datei eingestellt.
# Die Standard-Zeitüberschreitung für nslookup ist 1,5 Minuten.
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}'`

# Den Server, auf dem DNS läuft, durch Abrufen des Werts der
# Ressourceneigenschaft NETWORK_RESOURCES_USED identifizieren.
DNS_HOST=`scha_resource_get -O NETWORK_RESOURCES_USED -R $RESOURCE_NAME \
 -G $RESOURCEGROUP_NAMÈ

# Wiederholungszählerwert aus der systemdefinierten Eigenschaft Retry_count abrufen
RETRY_COUNT=`scha_resource_get -O RETRY_COUNT -R $RESOURCE_NAME \
-G  $RESOURCEGROUP_NAMÈ

# Wiederholungsintervallwert aus der systemdefinierten Eigenschaft
# Retry_interval abrufen
RETRY_INTERVAL=`scha_resource_get -O RETRY_INTERVAL -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Vollständigen Pfad für das Gettime-Dienstprogramm aus der
# RT_basedir-Eigenschaft des Ressourcentyps abrufen.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
-G \$RESOURCEGROUP_NAMÈ

# Der Test läuft in einer Endlosschleife und versucht nslookup-Befehle.
# Eine temporäre Datei für die nslookup-Antworten konfigurieren.
DNSPROBEFILE=/tmp/.$RESOURCE_NAME.probe
probefail=0
retries=0

while :
do
   # Das Intervall, in dem das Testsignal ausgeführt muss, ist in der
   # Eigenschaft THOROUGH_PROBE_INTERVAL angegeben. Daher das Testsignal für
   # eine Dauer von <THOROUGH_PROBE_INTERVAL> ruhen lassen
   sleep $PROBE_INTERVAL

   # Test ausführen, womit die IP-Adresse abgefragt wird, auf der
   # DNS läuft.
   hatimerun -t $PROBE_TIMEOUT /usr/sbin/nslookup $DNS_HOST $DNS_HOST
\
> $DNSPROBEFILE 2>&1

   retcode=$?
        if [ retcode -ne 0 ]; then
                probefail=1
        fi

   # Sicherstellen, dass die Antwort auf den nslookup-Befehl vom HA-DNS
   # -Server und nicht von einem anderen in der /etc/resolv.conf-Datei aufgelisteten
   # Server kommt.
   if [ $probefail -eq 0 ]; then
      # Namen des Servers abrufen, der auf die nslookup-Abfrage antwortet.
                   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

   # Wenn die probefail-Variable nicht auf 0 eingestellt ist, ist entweder die
   # Zeit für den nslookup-Befehl abgelaufen, oder die Antwort auf die Abfrage
   # kam von einem anderen Server (angegeben in der /etc/resolv.conf-Datei). In beiden
   # Fällen antwortet der DNS-Server nicht, und die Methode ruft
   # decide_restart_or_failover auf, wodurch ausgewertet wird, ob der Datendienst neu
   # gestartet oder ein Failover auf einen anderen Knoten ausgeführt wird.

   if [ $probefail -ne 0 ]; then
         decide_restart_or_failover
   else
         logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\
         “${ARGV0} Testsignal für HA-DNS-Ressource erfolgreich”
   fi
done

Monitor_start-Methode

Diese Methode startet das PROBE-Programm für den Datendienst.


Beispiel B–6 dns_monitor_start-Methode

#!/bin/ksh
#
# Monitor-Start-Methode für HA-DNS.
#
# Diese Methode startet den Monitor (Testsignal) für den Datendienst unter
# Steuerung durch PMF. Der Monitor ist ein Prozess, der den Datendienst in
# regelmäßigen Intervallen testet und im Fall von Problemen auf demselben
# Knoten neu startet oder ein Failover auf einen anderen Knoten im Cluster ausführt.
# Das PMF-Tag für den Monitor ist $RESOURCE_NAME.monitor.


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

###############################################################################
# Programmargumente analysieren.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Name der DNS-Ressource.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Name der Ressourcengruppe, in der die Ressource
                        # konfiguriert ist.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Name des Ressourcentyps.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
          logger -p ${SYSLOG_FACILITY}.err \
                   -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “FEHLER: Option $OPTARG unbekannt”
                     exit 1
                     ;;
                esac
        done

}

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

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

# syslog-Funktion abrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Argumente analysieren, die an diese Methode übergeben wurden
parse_args “$@”

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

# Feststellen, wo die Testsignal-Methode residiert, indem der Wert der
# RT_BASEDIR-Eigenschaft des Datendienstes abgerufen wird.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Das Testsignal für den Datendienst unter PMF starten. Option für
# uneingeschränkte Wiederholungen für das Starten des Testsignals verwenden.
# Den Ressourcennamen, Gruppe und Typ an die Testsignal-Methode übergeben.
pmfadm -c $PMF_TAG.monitor -n -1 -t -1 \
    $RT_BASEDIR/dns_probe -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME
    -T $RESOURCETYPE_NAME

# Meldung protokollieren, die angibt, dass der Monitor für HA-DNS
# gestartet wurde.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
           “${ARGV0} Monitor für HA-DNS wurde erfolgreich gestartet”
fi
exit 0 

Monitor_stop-Methode

Diese Methode stoppt das PROBE-Programm für den Datendienst.


Beispiel B–7 dns_monitor_stop-Methode

#!/bin/ksh
# Monitor-Stopp-Methode für HA-DNS
# Stoppt den laufenden Monitor mithilfe von PMF.

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

###############################################################################
# Programmargumente analysieren.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Name der DNS-Ressource.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Name der Ressourcengruppe, in der die Ressource
                        # konfiguriert ist.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Name des Ressourcentyps.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “FEHLER: Option $OPTARG unbekannt”
                     exit 1
                     ;;
                esac
        done
}

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

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

# syslog-Funktion abrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Argumente analysieren, die an diese Methode übergeben wurden
parse_args “$@”

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

# Prüfen, ob der Monitor läuft und gegebenenfalls Beenden erzwingen.
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} Monitor für Ressource “ \
          $RESOURCE_NAME konnte nicht gestoppt werden
           exit 1
   else
      # Monitor konnte erfolgreich gestoppt werden. Meldung protokollieren.
      logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\
          “${ARGV0} Monitor für Ressource “ $RESOURCE_NAME \
          “ erfolgreich gestoppt”
   fi
fi
exit 0

Monitor_check-Methode

Diese Methode überprüft das Vorhandensein des Verzeichnisses, auf das die Confdir-Eigenschaft zeigt. RGM ruft jedesmal Monitor_check auf, wenn die PROBE-Methode ein Failover des Datendienstes auf einen neuen Knoten ausführt, und prüft auch Knoten, die potenzielle Master sind.


Beispiel B–8 dns_monitor_check-Methode

#!/bin/ksh
# Monitor-Prüfmethode für DNS.
#
# RGM ruft diese Methode immer dann auf, wenn der Fehler-Monitor für den
# Datendienst ein Failover auf einen neuen Knoten ausführt. Monitor_check ruft
# die Validate-Methode auf, um zu prüfen, ob das Konfigurationsverzeichnis
# und die -dateien auf dem neuen Knoten verfügbar sind.

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

###############################################################################
# Programmargumente analysieren.
function parse_args # [args ...]
{
   typeset opt

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

      R)
      # Name der DNS-Ressource.
      RESOURCE_NAME=$OPTARG
      ;;

      G)
      # Name der Ressourcengruppe, in der die Ressource
      # konfiguriert ist.
      RESOURCEGROUP_NAME=$OPTARG
      ;;

      T)
      # Name des Ressourcentyps.
      RESOURCETYPE_NAME=$OPTARG
      ;;

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

}

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

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

# syslog-Funktion abrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Argumente analysieren, die an diese Methode übergeben wurden.
parse_args “$@”

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

# Vollständigen Pfad für die Validate-Methode aus der
# RT_BASEDIR-Eigenschaft des Ressourcentyps abrufen.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
   -G $RESOURCEGROUP_NAMÈ

# Namen der Validate-Methode für diese Ressource abrufen.
VALIDATE_METHOD=`scha_resource_get -O VALIDATE    -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Wert für die Confdir-Eigenschaft zum Starten des Datendienstes abrufen.
# Den eingegebenen Ressourcennamen und die Ressourcengruppe zum Abrufen des
# Confdir-Wertes verwenden, der bei Hinzufügen der Ressource eingestellt wurde.
config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME Confdir`

# scha_resource_get gibt sowohl den Typ als auch den Wert von
# Erweiterungseigenschaften zurück. awk verwenden, um nur den Wert der
# Erweiterungseigenschaft abzurufen.
CONFIG_DIR=`echo $config_info | awk `{print $2}'`

# Validate-Methode aufrufen, damit für den Datendienst ein erfolgreiches Failover
# auf den neuen Knoten ausgeführt werden kann.
$RT_BASEDIR/$VALIDATE_METHOD -R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
   -T $RESOURCETYPE_NAME -x Confdir=$CONFIG_DIR

# Meldung protokollieren, die angibt, dass die Monitor-Prüfung erfolgreich war.
if [ $? -eq 0 ]; then
   logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
      “${ARGV0} Monitor-Prüfung für DNS erfolgreich.”
   exit 0
else
   logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
      “${ARGV0} Monitor-Prüfung für DNS nicht erfolgreich.”
   exit 1
fi

Validate-Methode

Diese Methode überprüft das Vorhandensein des Verzeichnisses, auf das die Confdir-Eigenschaft zeigt. RGM ruft diese Methode auf, wenn der Datendienst erstellt wird und wenn der Cluster-Verwalter Datendiensteigenschaften aktualisiert. Die Monitor_check-Methode ruft diese Methode immer dann auf, wenn der Fehler-Monitor ein Failover des Datendienstes auf einen neuen Knoten ausführt.


Beispiel B–9 dns_validate-Methode

#!/bin/ksh
#
# Validate-Methode für HA-DNS.
# Diese Methode validiert die Confdir-Eigenschaft der Ressource. Die Validate-
# Methode wird in zwei Szenarios aufgerufen: Beim Erstellen der Ressource und beim
# Aktualisieren einer Ressourceneigenschaft. Beim Erstellen der Ressource
# wird diese Methode mit dem -c-Flag aufgerufen, und alle systemdefinierten
# und Erweiterungseigenschaften werden als Befehlszeilenargumente übergeben.
# Beim Aktualisieren einer Ressourceneigenschaft wird die Validate-Methode mit
# dem -u-Flag aufgerufen, und nur das Eigenschafts-/Wertepaar der zu aktualisierenden
# Eigenschaft wird als Befehlszeilenargument übergeben.
#
# Bsp.: Wenn die Ressource erstellt wird, lauten die Befehlsargumente
#
# dns_validate -c -R <..> -G <...> -T <..> -r <sysdef-prop=value>...
#       -x <extension-prop=value>.... -g <resourcegroup-prop=value>....
#
# Wenn die Ressourceneigenschaft aktualisiert wird
#
# dns_validate -u -R <..> -G <...> -T <..> -r <sys-prop_being_updated=value>
#   ODER
# dns_validate -u -R <..> -G <...> -T <..> -x <extn-prop_being_updated=value>

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

###############################################################################
#  Programmargumente analysieren.
#
function parse_args # [args ...]
{
   typeset opt

   while getopts `cur:x:g:R:T:G:' opt
   do
                case “$opt” in
                R)
                        # Name der DNS-Ressource.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Name der Ressourcengruppe, in der die Ressource
                        # konfiguriert ist.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Name des Ressourcentyps.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                r)
                        #Die Methode greift auf keine systemdefinierten Eigenschaften
                        #zu, so dass diese Option nicht besteht.
                        ;;
                g)
                        # Die Methode greift auf keine Ressourcengruppeneigenschaften
                        # zu, so dass diese Option nicht besteht.
                        ;;
                c)
                        # Gibt an, dass die Validate-Methode aufgerufen wird, während
                        # die Ressource erstellt wird, so dass dieses Flag nicht als
                        # Option besteht.
                        ;;
                u)
                        # Gibt die Aktualisierung einer Eigenschaft an, wenn die
                        # Ressource bereits vorhanden ist. Wenn die Confdir-Eigenschaft
                        # aktualisiert wird, muss Confdir in den Befehlszeilenargumenten
                        # stehen. Andernfalls muss die Methode eigens unter Verwendung von
                        # scha_resource_get danach suchen.
                        UPDATE_PROPERTY=1
                        ;;
                x)
                        # Erweiterungseigenschaftsliste. Eigenschafts- und Wertepaare
                        # werden mit “=” als Trennzeichen voneinander getrennt.
                        PROPERTY=`echo $OPTARG | awk -F= `{print $1}'`
                        VAL=`echo $OPTARG | awk -F= `{print $2}'`

                        # Wenn die Confdir-Erweiterungseigenschaft in der Befehlszeile
                        # steht, deren Wert festhalten.
                        if [ $PROPERTY == “Confdir” ];
                        then
                        CONFDIR=$VAL
                        CONFDIR_FOUND=1
                        fi
                        ;;
                *)
                        logger -p ${SYSLOG_FACILITY}.err \
                        -t [$SYSLOG_TAG] \
                        “FEHLER: Option $OPTARG unbekannt”
                        exit 1
                        ;;
                esac
   done
}

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

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

# syslog-Funktion abrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Den Wert von CONFDIR auf Null einstellen. Später ruft diese Methode
# den Wert der Confdir-Eigenschaft von der Befehlszeile aus oder mithilfe
# von scha_resource_get ab.
CONFDIR=””
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

# Argumente analysieren, die für diese Methode übergeben wurden.
parse_args “$@”

# Wenn die Validate-Methode wegen Aktualisierung von Eigenschaften
# aufgerufen wird, versuchen, den Wert der Confdir-Erweiterungseigenschaft von der
# Befehlszeile aus abzurufen. Andernfalls den Wert von Confdir mithilfe von
# scha_resource_get abrufen.
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

# Überprüfen, ob die Confdir-Eigenschaft einen Wert hat. Andernfalls tritt ein
# Fehlschlag ein, und es wird mit Status 1 beendet.
if [[ -z $CONFDIR ]]; then
   logger -p ${SYSLOG_FACILITY}.err \
       “${ARGV0} Validate-Methode für Ressource “$RESOURCE_NAME “ fehlgeschlagen”
   exit 1
fi

# Jetzt den aktuellen Confdir-Eigenschaftswert validieren.

# Überprüfen, ob der Zugriff auf $CONFDIR möglich ist.
if [ ! -d $CONFDIR ]; then
        logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG]\
            “${ARGV0} Verzeichnis $CONFDIR fehlt oder nicht eingehängt”
        exit 1
fi

# Überprüfen, ob die named.conf-Datei im Confdir-Verzeichnis vorhanden ist.
if [ ! -s $CONFDIR/named.conf ]; then
        logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
            “${ARGV0} Datei $CONFDIR/named.conf fehlt oder ist leer”
        exit 1
fi

# Meldung protokollieren, die angibt, dass die Validate-Methode erfolgreich war.
logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
   “${ARGV0} Validate-Methode für Ressource “$RESOURCE_NAME \
   “ erfolgreich beendet”

exit 0

Update-Methode

RGM ruft die Update-Methode auf, um eine laufende Ressource von der Änderung ihrer Eigenschaften zu benachrichtigen.


Beispiel B–10 dns_update-Methode

#!/bin/ksh
#
# Update-Methode für HA-DNS.
#
# Die Aktualisierungen der Eigenschaften an sich nimmt RGM vor. Aktualisierungen
# betreffen nur den Fehler-Monitor, so dass diese Methode den Fehler-Monitor neu
# starten muss.

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

###############################################################################
# Programmargumente analysieren.
#
function parse_args # [args ...]
{
        typeset opt

        while getopts `R:G:T:' opt
        do
                case “$opt” in
                R)
                        # Name der DNS-Ressource.
                        RESOURCE_NAME=$OPTARG
                        ;;
                G)
                        # Name der Ressourcengruppe, in der die Ressource
                        # konfiguriert ist.
                        RESOURCEGROUP_NAME=$OPTARG
                        ;;
                T)
                        # Name des Ressourcentyps.
                        RESOURCETYPE_NAME=$OPTARG
                        ;;
                *)
                    logger -p ${SYSLOG_FACILITY}.err \
                    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                    “FEHLER: Option $OPTARG unbekannt”
                     exit 1
                     ;;
                esac
        done
}

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

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

# syslog-Funktion abrufen, mit der Meldungen protokolliert werden.
SYSLOG_FACILITY=`scha_cluster_get -O SYSLOG_FACILITY`

# Argumente analysieren, die an diese Methode übergeben wurden
parse_args “$@”

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

# Feststellen, wo die Testsignal-Methode residiert, indem der Wert der
# RT_BASEDIR-Eigenschaft der Ressource abgerufen wird.
RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAMÈ

# Wenn die Update-Methode aufgerufen wird, aktualisiert RGM den Wert der
# Eigenschaft, die aktualisiert wird. Diese Methode muss prüfen, ob der
# Fehler-Monitor (Testsignal) läuft. Falls ja, muss das Beenden erzwungen
# und neu gestartet werden.
if pmfadm -q $PMF_TAG.monitor; then

   # Beenden des bereits laufenden Monitors erzwingen
        pmfadm -s $PMF_TAG.monitor TERM
        if [ $? -ne 0 ]; then
                logger -p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
                    “${ARGV0} Monitor konnte nicht gestoppt werden”
                exit 1
        else
               # DNS konnte erfolgreich gestoppt werden. Meldung protokollieren.
                logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG] \
                    “Monitor für HA-DNS erfolgreich gestoppt”
        fi

   # Monitor neu starten.
   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} Monitor für HA-DNS konnte nicht neu gestartet werden “
      exit 1
   else
      logger -p ${SYSLOG_FACILITY}.info -t [$SYSLOG_TAG]\
                    “Monitor für HA-DNS erfolgreich neu gestartet”
   fi
fi
exit 0