[BACK]Return to html.tar CVS log [TXT][DIR] Up to [Development] / projects / failsafe / FailSafe-books / LnxFailSafe_PG

File: [Development] / projects / failsafe / FailSafe-books / LnxFailSafe_PG / html.tar (download)

Revision 1.2, Thu Nov 30 01:33:30 2000 UTC (16 years, 11 months ago) by vasa
Branch: MAIN
CVS Tags: HEAD
Changes since 1.1: +0 -0 lines

Previous version of the html.tar file got corrupted somehow. This is the correct one.

html/004075500016050000001000000000000717757045000123415ustar00gfergother00002640000003html/doc-index.html010064400016050000001000000603330717757025300151040ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Index</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Glossary"
HREF="g3001.html"></HEAD
><BODY
CLASS="INDEX"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="g3001.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
>&nbsp;</TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><H1
><A
NAME="DOC-INDEX"
>Index</A
></H1
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3256"
>Symbols</A
></H1
><DL
><DT
>/etc/failsafe/cmon_process_groups  directory,
    <A
HREF="z942786646lhj.html"
>Monitoring Agents</A
>
  </DT
><DT
>/usr/lib/failsafe/cmgr-templates/cmgr-create-resource_type  directory,
    <A
HREF="z943900431lhj.html"
>Using cluster_mgr With a Script</A
>
  </DT
><DT
>/usr/lib/failsafe/policies directory,
    <A
HREF="fpcontent.html#AEN1645"
>Failover Scripts</A
>
  </DT
><DT
> resource group
  </DT
><DD
><DL
><DT
>definition,
    <A
HREF="le60545-parent.html#AEN261"
>Resource Group</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3271"
>A</A
></H1
><DL
><DT
>action scripts,
    <A
HREF="le60545-parent.html#AEN399"
>Action Scripts</A
>
  </DT
><DD
><DL
><DT
>examples,
    <A
HREF="le49536-parent.html"
>Examples of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>failure of,
    <A
HREF="z942787505lhj.html#Z944596365SMG"
>Failure of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>format
  </DT
><DD
><DL
><DT
>basic action,
    <A
HREF="z942786582lhj.html#AEN1237"
>Basic Action </A
>
  </DT
><DT
>completion,
    <A
HREF="z942786582lhj.html#AEN1303"
>Complete the Action</A
>
  </DT
><DT
>exit status,
    <A
HREF="z942786582lhj.html#AEN1206"
>Exit Status</A
>
  </DT
><DT
>header,
    <A
HREF="z942786582lhj.html#AEN1147"
>Header Information</A
>
  </DT
><DT
>overview,
    <A
HREF="z942786582lhj.html"
>Script Format</A
>
  </DT
><DT
>read input file,
    <A
HREF="z942786582lhj.html#AEN1287"
>Read Input File</A
>
  </DT
><DT
>read resource information,
    <A
HREF="z942786582lhj.html#AEN1157"
>Set Local Variables</A
>,
    <A
HREF="z942786582lhj.html#AEN1177"
>Read Resource Information</A
>
  </DT
><DT
>set global variables,
    <A
HREF="z942786582lhj.html#AEN1254"
>Set Global Variables</A
>
  </DT
><DT
>set local variables,
    <A
HREF="z942786582lhj.html#AEN1157"
>Set Local Variables</A
>
  </DT
><DT
>verify arguments,
    <A
HREF="z942786582lhj.html#AEN1271"
>Verify Arguments</A
>
  </DT
></DL
></DD
><DT
>monitoring
  </DT
><DD
><DL
><DT
>frequence,
    <A
HREF="z942786569lhj.html#AEN1059"
>How Often Should Monitoring Occur?</A
>
  </DT
><DT
>necessity of,
    <A
HREF="z942786569lhj.html#LE54960-PARENT"
>Is Monitoring Necessary?</A
>
  </DT
><DT
>testing examples,
    <A
HREF="z942786569lhj.html#AEN1072"
>Examples of Testing for Monitoring Failure</A
>
  </DT
><DT
>types,
    <A
HREF="z942786569lhj.html#AEN1031"
>Types of Monitoring</A
>
  </DT
></DL
></DD
><DT
>optional,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>preparation for writing scripts,
    <A
HREF="z942786569lhj.html"
>Preparation</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>required,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>resource types provided,
    <A
HREF="z942786569lhj.html"
>Preparation</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>set of scripts,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>successful execution results,
    <A
HREF="z942787505lhj.html#Z942863078LHJ"
>Successful Execution of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>templates,
    <A
HREF="z942786569lhj.html"
>Preparation</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>testing,
    <A
HREF="x2401.html"
>Testing an Action Script</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>writing steps,
    <A
HREF="z942786601lhj.html"
>Steps in Writing a Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>agents,
    <A
HREF="z942786646lhj.html"
>Monitoring Agents</A
>
  </DT
><DT
>application failover domain,
    <A
HREF="le60545-parent.html#AEN362"
>Failover Domain</A
>
  </DT
><DT
>attributes,
    <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
>
  </DT
><DT
>Auto_Failback failover attribute,
    <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
>
  </DT
><DT
>Auto_Recovery failover attribute,
    <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3344"
>C</A
></H1
><DL
><DT
>check arguments,
    <A
HREF="x2852.html"
>Check Arguments</A
>
  </DT
><DT
>cluster,
    <A
HREF="le60545-parent.html#AEN207"
>Cluster</A
>
  </DT
><DT
>cluster node,
    <A
HREF="le60545-parent.html#AEN192"
>Cluster Node (or Node)</A
>
  </DT
><DT
>cluster_mgr  command,
    <A
HREF="z943900404lhj.html"
>Using cluster_mgr Interactively</A
>
  </DT
><DT
>cmgr  command,
    <A
HREF="z943900404lhj.html"
>Using cluster_mgr Interactively</A
>
  </DT
><DT
>cmond  process
  </DT
><DD
><DL
><DT
>configuration,
    <A
HREF="z942786646lhj.html"
>Monitoring Agents</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>command execution function,
    <A
HREF="x2890.html"
>Execute a Command</A
>
  </DT
><DT
>command path,
    <A
HREF="x2618.html#AEN2644"
>HA_CMDSPATH</A
>
  </DT
><DT
>concepts,
    <A
HREF="le60545-parent.html"
>Concepts</A
>
  </DT
><DT
>configurations
  </DT
><DD
><DL
><DT
>N+1,
    <A
HREF="fpexample.html#AEN1767"
>N+1 Configuration for Linux FailSafe</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>N+2,
    <A
HREF="fpexample.html#AEN1823"
>N+2 Configuration</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>N+M,
    <A
HREF="fpexample.html#AEN1866"
>N+M Configuration for Linux FailSafe</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>Controlled_Failback failover attribute,
    <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3385"
>D</A
></H1
><DL
><DT
>database location,
    <A
HREF="x2618.html#AEN2709"
>HA_CDB</A
>
  </DT
><DT
>debug script messages,
    <A
HREF="x2618.html#AEN2759"
>HA_DBGLOG</A
>
  </DT
><DT
>debugging information in action scripts,
    <A
HREF="x2321.html"
>General Testing and Debugging Techniques</A
>
  </DT
><DT
>dependency list,
    <A
HREF="le60545-parent.html#AEN318"
>Resource Type Dependency List</A
>
  </DT
><DT
>domain,
    <A
HREF="le60545-parent.html#AEN362"
>Failover Domain</A
>,
    <A
HREF="fpcontent.html#AEN1522"
>Failover Domain</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3403"
>E</A
></H1
><DL
><DT
>environment variables,
    <A
HREF="x2618.html"
>Set Global Definitions</A
>
  </DT
><DT
>exclusive  script
  </DT
><DD
><DL
><DT
>example,
    <A
HREF="le49536-parent.html#AEN1412"
>exclusive Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>exclusive script
  </DT
><DD
><DL
><DT
>definition,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>execute a command,
    <A
HREF="x2890.html"
>Execute a Command</A
>
  </DT
><DT
>exit status in action scripts,
    <A
HREF="z942786582lhj.html#AEN1206"
>Exit Status</A
>
  </DT
><DT
>exit_script()  function,
    <A
HREF="z942786582lhj.html#AEN1206"
>Exit Status</A
>,
    <A
HREF="x2401.html"
>Testing an Action Script</A
>
  </DT
><DT
>exit_status  value,
    <A
HREF="z942786582lhj.html#AEN1206"
>Exit Status</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3429"
>F</A
></H1
><DL
><DT
>failover,
    <A
HREF="le60545-parent.html#AEN341"
>Failover</A
>
  </DT
><DT
>failover attributes,
    <A
HREF="le60545-parent.html#AEN374"
>Failover Attribute</A
>,
    <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
>
  </DT
><DT
>failover domain,
    <A
HREF="le60545-parent.html#AEN362"
>Failover Domain</A
>,
    <A
HREF="fpcontent.html#AEN1522"
>Failover Domain</A
>
  </DT
><DT
>failover policy,
    <A
HREF="le60545-parent.html#AEN347"
>Failover Policy</A
>
  </DT
><DD
><DL
><DT
>contents,
    <A
HREF="fpcontent.html"
>Contents of a Failover Policy</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>examples
  </DT
><DD
><DL
><DT
>N+1,
    <A
HREF="fpexample.html#AEN1767"
>N+1 Configuration for Linux FailSafe</A
>
  </DT
><DT
>N+2,
    <A
HREF="fpexample.html#AEN1823"
>N+2 Configuration</A
>
  </DT
><DT
>N+M,
    <A
HREF="fpexample.html#AEN1866"
>N+M Configuration for Linux FailSafe</A
>
  </DT
></DL
></DD
><DT
>failover attributes,
    <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>failover domain,
    <A
HREF="fpcontent.html#AEN1522"
>Failover Domain</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>failover script,
    <A
HREF="fpcontent.html#AEN1645"
>Failover Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>failover script interface,
    <A
HREF="fpinterface.html"
>Failover Script Interface</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>failover script
  </DT
><DD
><DL
><DT
>description,
    <A
HREF="le60545-parent.html#AEN382"
>Failover Scripts</A
>,
    <A
HREF="fpcontent.html#AEN1645"
>Failover Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>interface,
    <A
HREF="fpinterface.html"
>Failover Script Interface</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>field value,
    <A
HREF="x2932.html"
>Get the Value for a Field</A
>
  </DT
><DT
>filesystemresource type,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3475"
>G</A
></H1
><DL
><DT
>get_xxx_info()  function,
    <A
HREF="z942786582lhj.html#AEN1177"
>Read Resource Information</A
>
  </DT
><DT
>global definition setting,
    <A
HREF="x2618.html"
>Set Global Definitions</A
>
  </DT
><DT
>global variables,
    <A
HREF="z942786582lhj.html#AEN1254"
>Set Global Variables</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3486"
>H</A
></H1
><DL
><DT
>HA_CDB environment variable,
    <A
HREF="x2618.html#AEN2709"
>HA_CDB</A
>
  </DT
><DT
>ha_check_args()  function,
    <A
HREF="z942786582lhj.html#AEN1271"
>Verify Arguments</A
>,
    <A
HREF="x2852.html"
>Check Arguments</A
>
  </DT
><DT
>HA_CMDSPATH environment variable,
    <A
HREF="x2618.html#AEN2644"
>HA_CMDSPATH</A
>
  </DT
><DT
>HA_CMD_FAILED environment variable,
    <A
HREF="x2618.html#AEN2818"
>HA_CMD_FAILED</A
>
  </DT
><DT
>HA_CURRENT_LOGLEVEL environment variable,
    <A
HREF="x2618.html#AEN2769"
>HA_CURRENT_LOGLEVEL</A
>
  </DT
><DT
>HA_DBGLOG environment variable,
    <A
HREF="x2618.html#AEN2759"
>HA_DBGLOG</A
>
  </DT
><DT
>HA_DBGLVL environment variable,
    <A
HREF="x2618.html#AEN2728"
>HA_DBGLVL</A
>
  </DT
><DT
>ha_execute_cmd()  function,
    <A
HREF="x2890.html"
>Execute a Command</A
>
  </DT
><DT
>ha_execute_cmd_ret()  function,
    <A
HREF="x2890.html"
>Execute a Command</A
>
  </DT
><DT
>ha_get_field() function,
    <A
HREF="x2932.html"
>Get the Value for a Field</A
>
  </DT
><DT
>ha_get_info()  function,
    <A
HREF="x2955.html"
>Get Resource Information</A
>
  </DT
><DT
>HA_HOSTNAME environment variable,
    <A
HREF="x2618.html#AEN2632"
>HA_HOSTNAME</A
>
  </DT
><DT
>HA_INVAL_ARGS environment variable,
    <A
HREF="x2618.html#AEN2810"
>HA_INVAL_ARGS</A
>
  </DT
><DT
>HA_LOG environment variable,
    <A
HREF="x2618.html#AEN2780"
>HA_LOG</A
>
  </DT
><DT
>HA_LOGCMD environment variable,
    <A
HREF="x2618.html#AEN2678"
>HA_LOGCMD</A
>
  </DT
><DT
>HA_NOCFGINFO environment variable,
    <A
HREF="x2618.html#AEN2845"
>HA_NOCFGINFO</A
>
  </DT
><DT
>HA_NORMLVL environment variable,
    <A
HREF="x2618.html#AEN2721"
>HA_NORMLVL</A
>
  </DT
><DT
>HA_NOTSUPPORTED environment variable,
    <A
HREF="x2618.html#AEN2837"
>HA_NOTSUPPORTED</A
>
  </DT
><DT
>HA_NOT_RUNNING environment variable,
    <A
HREF="x2618.html#AEN2802"
>HA_NOT_RUNNING</A
>
  </DT
><DT
>ha_print_exclusive_status()  function,
    <A
HREF="x2982.html"
>Print Exclusivity Check Messages</A
>
  </DT
><DT
>ha_print_exclusive_status_all_resources()  function,
    <A
HREF="x2982.html"
>Print Exclusivity Check Messages</A
>
  </DT
><DT
>HA_PRIVCMDSPATH environment variable,
    <A
HREF="x2618.html#AEN2665"
>HA_PRIVCMDSPATH</A
>
  </DT
><DT
>ha_read_infile()  function,
    <A
HREF="z942786582lhj.html#AEN1287"
>Read Input File</A
>,
    <A
HREF="x2876.html"
>Read an Input File</A
>
  </DT
><DT
>HA_RESOURCEQUERYCMD environment variable,
    <A
HREF="x2618.html#AEN2686"
>HA_RESOURCEQUERYCMD</A
>
  </DT
><DT
>HA_RUNNING environment variable,
    <A
HREF="x2618.html#AEN2829"
>HA_RUNNING</A
>
  </DT
><DT
>HA_SCRIPTGROUP environment variable,
    <A
HREF="x2618.html#AEN2737"
>HA_SCRIPTGROUP</A
>
  </DT
><DT
>HA_SCRIPTSUBSYS environment variable,
    <A
HREF="x2618.html#AEN2747"
>HA_SCRIPTSUBSYS</A
>
  </DT
><DT
>HA_SCRIPTTMPDIR environment variable,
    <A
HREF="x2618.html#AEN2699"
>HA_SCRIPTTMPDIR</A
>
  </DT
><DT
>HA_SUCCESS environment variable,
    <A
HREF="x2618.html#AEN2791"
>HA_SUCCESS</A
>
  </DT
><DT
>ha_write_status_for_all_resources()  function,
    <A
HREF="x2912.html"
>Write Status for a Resource</A
>
  </DT
><DT
>ha_write_status_for_resource  function,
    <A
HREF="z942786582lhj.html#AEN1206"
>Exit Status</A
>
  </DT
><DT
>ha_write_status_for_resource()  function,
    <A
HREF="x2912.html"
>Write Status for a Resource</A
>
  </DT
><DT
>high availability characterists,
    <A
HREF="le56070-parent.html"
>Characteristics that Permit an Application to be Highly Available</A
>
  </DT
><DT
>highly available
  </DT
><DD
><DL
><DT
>services,
    <A
HREF="le37432-parent.html"
>Highly Available Services Included with Linux FailSafe</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>hostname,
    <A
HREF="x2618.html#AEN2644"
>HA_CMDSPATH</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3596"
>I</A
></H1
><DL
><DT
>initial failover domain,
    <A
HREF="fpcontent.html#AEN1522"
>Failover Domain</A
>
  </DT
><DT
>InPlace_Recovery failover attribute,
    <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
>
  </DT
><DT
>input file,
    <A
HREF="x2876.html"
>Read an Input File</A
>
  </DT
><DT
>IP address service,
    <A
HREF="le37432-parent.html"
>Highly Available Services Included with Linux FailSafe</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3610"
>L</A
></H1
><DL
><DT
>logs,
    <A
HREF="x2618.html#AEN2747"
>HA_SCRIPTSUBSYS</A
>
  </DT
><DT
>LVM logical volume service,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3618"
>M</A
></H1
><DL
><DT
>MAC address service,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
><DT
>MAC_address  resource type,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
><DT
>membership,
    <A
HREF="le60545-parent.html#AEN213"
>Node Membership</A
>
  </DT
><DT
>monitor  script
  </DT
><DD
><DL
><DT
>example,
    <A
HREF="le49536-parent.html#AEN1390"
>monitor Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>monitor script
  </DT
><DD
><DL
><DT
>definition,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>monitoring
  </DT
><DD
><DL
><DT
>agents,
    <A
HREF="z942786646lhj.html"
>Monitoring Agents</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>failure,
    <A
HREF="z942786569lhj.html#AEN1046"
>What are the Symptoms of Monitoring Failure?</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>frequence,
    <A
HREF="z942786569lhj.html#AEN1059"
>How Often Should Monitoring Occur?</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>necessity of,
    <A
HREF="z942786569lhj.html#LE54960-PARENT"
>Is Monitoring Necessary?</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>script testing,
    <A
HREF="x2482.html"
>Special Testing Considerations for the monitor Script</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>testing examples,
    <A
HREF="z942786569lhj.html#AEN1072"
>Examples of Testing for Monitoring Failure</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>types,
    <A
HREF="z942786569lhj.html#LE54960-PARENT"
>Is Monitoring Necessary?</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3653"
>N</A
></H1
><DL
><DT
>node,
    <A
HREF="le60545-parent.html#AEN192"
>Cluster Node (or Node)</A
>
  </DT
><DT
>node membership,
    <A
HREF="le60545-parent.html#AEN213"
>Node Membership</A
>
  </DT
><DT
>node status,
    <A
HREF="x2321.html"
>General Testing and Debugging Techniques</A
>
  </DT
><DT
>nodename output,
    <A
HREF="x2618.html#AEN2644"
>HA_CMDSPATH</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3667"
>O</A
></H1
><DL
><DT
>order ranges for resource types,
    <A
HREF="le43007-parent.html"
>Defining a New Resource Type</A
>
  </DT
><DT
>ordered  failover script,
    <A
HREF="fpcontent.html#AEN1661"
>The ordered Failover Script</A
>
  </DT
><DT
>overview of the programming steps,
    <A
HREF="le37841-parent.html"
>Overview of the Programming Steps</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3678"
>P</A
></H1
><DL
><DT
>path to user commands,
    <A
HREF="x2618.html#AEN2644"
>HA_CMDSPATH</A
>
  </DT
><DT
>plug-ins,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
><DT
>pool,
    <A
HREF="le60545-parent.html#AEN201"
>Pool</A
>
  </DT
><DT
>print exclusivity check messages,
    <A
HREF="x2982.html"
>Print Exclusivity Check Messages</A
>
  </DT
><DT
>privileged command path,
    <A
HREF="x2618.html#AEN2665"
>HA_PRIVCMDSPATH</A
>
  </DT
><DT
>process
  </DT
><DD
><DL
><DT
>membership,
    <A
HREF="le60545-parent.html#AEN221"
>Process Membership</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>programming steps overview,
    <A
HREF="le37841-parent.html"
>Overview of the Programming Steps</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3702"
>R</A
></H1
><DL
><DT
>read an input file,
    <A
HREF="x2876.html"
>Read an Input File</A
>
  </DT
><DT
>resource
  </DT
><DD
><DL
><DT
>definition,
    <A
HREF="le60545-parent.html#AEN228"
>Resource</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>dependency list,
    <A
HREF="le60545-parent.html#AEN318"
>Resource Type Dependency List</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>name,
    <A
HREF="le60545-parent.html#AEN254"
>Resource Name</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>query command,
    <A
HREF="x2618.html#AEN2686"
>HA_RESOURCEQUERYCMD</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>resource group
  </DT
><DD
><DL
><DT
>states,
    <A
HREF="z942787505lhj.html#Z942863078LHJ"
>Successful Execution of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>resource information
  </DT
><DD
><DL
><DT
>obtaining,
    <A
HREF="x2955.html"
>Get Resource Information</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>read into an action script,
    <A
HREF="z942786582lhj.html#AEN1177"
>Read Resource Information</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>resource type
  </DT
><DD
><DL
><DT
>cluster_mgr  use,
    <A
HREF="z943900404lhj.html"
>Using cluster_mgr Interactively</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>dependency list,
    <A
HREF="le60545-parent.html#AEN318"
>Resource Type Dependency List</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>description,
    <A
HREF="le60545-parent.html#AEN236"
>Resource Type</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>GUI use,
    <A
HREF="z943900385lhj.html#AEN2110"
>Define a New Resource Type</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>information required to define a new resource type,
    <A
HREF="le43007-parent.html"
>Defining a New Resource Type</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>order ranges,
    <A
HREF="le43007-parent.html"
>Defining a New Resource Type</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>provided with Linux FailSafe,
    <A
HREF="le37432-parent.html"
>Highly Available Services Included with Linux FailSafe</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>restart mode,
    <A
HREF="le43007-parent.html"
>Defining a New Resource Type</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>script templates,
    <A
HREF="z943900431lhj.html"
>Using cluster_mgr With a Script</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>script use,
    <A
HREF="z943900431lhj.html"
>Using cluster_mgr With a Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>restart  script
  </DT
><DD
><DL
><DT
>example,
    <A
HREF="le49536-parent.html#AEN1425"
>restart Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>restart mode,
    <A
HREF="le43007-parent.html"
>Defining a New Resource Type</A
>
  </DT
><DT
>restart script
  </DT
><DD
><DL
><DT
>definition,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>root command path,
    <A
HREF="x2618.html#AEN2665"
>HA_PRIVCMDSPATH</A
>
  </DT
><DT
>run-time failover domain,
    <A
HREF="fpcontent.html#AEN1522"
>Failover Domain</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3766"
>S</A
></H1
><DL
><DT
>script group log,
    <A
HREF="x2618.html#AEN2737"
>HA_SCRIPTGROUP</A
>
  </DT
><DT
>script library,
    <A
HREF="z944252972lhj.html"
>Using the SRM Script Library</A
>
  </DT
><DT
>script testing
  </DT
><DD
><DL
><DT
>action scripts,
    <A
HREF="x2401.html"
>Testing an Action Script</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>monitoring script considerations,
    <A
HREF="x2482.html"
>Special Testing Considerations for the monitor Script</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>techniques,
    <A
HREF="x2321.html"
>General Testing and Debugging Techniques</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>script.$$ suffix,
    <A
HREF="z942786601lhj.html"
>Steps in Writing a Script</A
>
  </DT
><DT
>scriptlib  file,
    <A
HREF="z944252972lhj.html"
>Using the SRM Script Library</A
>
  </DT
><DT
>scripts. See  action scripts or failover script,
    <A
HREF="z942786582lhj.html"
>Script Format</A
>
  </DT
><DT
>set_global_variables()  function,
    <A
HREF="z942786582lhj.html#AEN1254"
>Set Global Variables</A
>
  </DT
><DT
>set_local_variables()  section of an action script,
    <A
HREF="z942786582lhj.html#AEN1157"
>Set Local Variables</A
>
  </DT
><DT
>start  script
  </DT
><DD
><DL
><DT
>example,
    <A
HREF="le49536-parent.html#AEN1354"
>start Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>start script
  </DT
><DD
><DL
><DT
>definition,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>status of a node,
    <A
HREF="x2321.html"
>General Testing and Debugging Techniques</A
>
  </DT
><DT
>stop  script
  </DT
><DD
><DL
><DT
>example,
    <A
HREF="le49536-parent.html#AEN1372"
>stop Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>stop script
  </DT
><DD
><DL
><DT
>definition,
    <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3816"
>T</A
></H1
><DL
><DT
>templates
  </DT
><DD
><DL
><DT
>action scripts,
    <A
HREF="z942786569lhj.html"
>Preparation</A
>
  </DT
><DD
><DL
></DL
></DD
><DT
>resource type script definition,
    <A
HREF="z943900431lhj.html"
>Using cluster_mgr With a Script</A
>
  </DT
><DD
><DL
></DL
></DD
></DL
></DD
><DT
>testing scripts. See  script testing,
    <A
HREF="x2321.html"
>General Testing and Debugging Techniques</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3827"
>U</A
></H1
><DL
><DT
>uname  command,
    <A
HREF="x2618.html#AEN2644"
>HA_CMDSPATH</A
>
  </DT
><DT
>user command path,
    <A
HREF="x2618.html#AEN2644"
>HA_CMDSPATH</A
>
  </DT
><DT
>usr/lib/failsafe/resource_types directory,
    <A
HREF="le43007-parent.html"
>Defining a New Resource Type</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3838"
>V</A
></H1
><DL
><DT
>value for a field,
    <A
HREF="x2932.html"
>Get the Value for a Field</A
>
  </DT
><DT
>volume  resource type,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3846"
>W</A
></H1
><DL
><DT
>write status for a resource,
    <A
HREF="x2912.html"
>Write Status for a Resource</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3851"
>X</A
></H1
><DL
><DT
>XFS file system service,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
></DL
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="g3001.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Glossary</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>/H1
><DL
><DT
>logs,
    <A
HREF="x2618.html#AEN2747"
>HA_SCRIPTSUBSYS</A
>
  </DT
><DT
>LVM logical volume service,
    <A
HREF="plugin.html"
>Plug-Ins</A
>
  </DT
></DL
><H1
CLASS="INDEXDIV"
><A
NAME="AEN3618"
>M</A
></H1
><DL
><DT
>MAC address service,
    <A
HREF="plugin.html"
>Plug-Ins</html/fpcontent.html010064400016050000001000000500410717757010400152200ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Contents of a Failover Policy</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Creating a Failover Policy"
HREF="le16529-parent.html"><LINK
REL="PREVIOUS"
TITLE="Creating a Failover Policy"
HREF="le16529-parent.html"><LINK
REL="NEXT"
TITLE="Failover Script Interface"
HREF="fpinterface.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le16529-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 3. Creating a Failover Policy</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="fpinterface.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="FPCONTENT"
>3.1. Contents of a Failover Policy</A
></H1
><P
>A <I
CLASS="FIRSTTERM"
>failover policy</I
> is the method by which
a resource group is failed over from one node to another. A failover policy
consists of the following:</P
><P
></P
><UL
><LI
><P
>Failover domain</P
></LI
><LI
><P
>Failover attributes</P
></LI
><LI
><P
>Failover scripts</P
></LI
></UL
><P
>Linux FailSafe uses the failover domain output from a failover script
along with failover attributes to determine on which node a resource group
should reside. </P
><P
>The administrator must configure a failover policy for each resource
group. The name of the failover policy must be unique within the pool.</P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1522"
>3.1.1. Failover Domain</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>failover domain</I
> is the <TT
CLASS="LITERAL"
>ordered</TT
> list of nodes on which a given resource group can be allocated.
The nodes listed in the failover domain <TT
CLASS="LITERAL"
>must</TT
> be within
the same cluster; however, the failover domain does not have to include
every node in the cluster. The failover domain can also be used to statically
load balance the resource groups in a cluster.</P
><P
>Examples:<P
></P
><UL
><LI
><P
>In a four&#8211;node cluster, a set of two nodes that
have access to a particular XLV volume may be the failover domain of the
resource group containing that XLV volume.</P
></LI
><LI
><P
>In a cluster of nodes named venus, mercury, and pluto,
you could configure the following initial failover domains for resource
groups RG1 and RG2:  <P
></P
><UL
><LI
><P
>mercury, venus, pluto for RG1</P
></LI
><LI
><P
>pluto, mercury for RG2</P
></LI
></UL
></P
></LI
></UL
></P
><P
>The administrator defines the initial failover domain
when configuring a failover policy. The initial failover domain is used
when a cluster is first booted. The ordered list specified by the initial
failover domain is transformed into a run-time failover domain
by the failover script. With each failure, the failover script takes the
current run-time failover domain and potentially modifies it; the initial
failover domain is never used again. Depending on the run-time conditions
 and contents of the failover script, the initial and run-time failover
domains may be identical.</P
><P
>For example, suppose the initial failover domain is: <P
CLASS="LITERALLAYOUT"
>N1&nbsp;N2&nbsp;N3</P
></P
><P
>The runtime failover domain will vary based on the failover script: <P
></P
><UL
><LI
><P
>If <TT
CLASS="LITERAL"
>ordered</TT
>:  <P
CLASS="LITERALLAYOUT"
>N1&nbsp;N2&nbsp;N3</P
></P
></LI
><LI
><P
>If <TT
CLASS="LITERAL"
>round-robin</TT
>:  <P
CLASS="LITERALLAYOUT"
>N2&nbsp;N3&nbsp;N1</P
></P
></LI
><LI
><P
>If a customized failover script, the order could be any
permutation, based on the contents of the script: <P
CLASS="LITERALLAYOUT"
>N1&nbsp;N2&nbsp;N3<br>
N1&nbsp;N3&nbsp;N2<br>
N2&nbsp;N3&nbsp;N1<br>
N2&nbsp;N1&nbsp;N3<br>
N3&nbsp;N2&nbsp;N1<br>
N3&nbsp;N1&nbsp;N2</P
></P
></LI
></UL
></P
><P
>Linux FailSafe stores the run-time failover domain and uses it as
input to the next failover script invocation.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1567"
>3.1.2. Failover Attributes</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>failover attribute</I
> is a value that is passed
to the failover scrip and used by Linux FailSafe for the purpose of modifying
the run-time failover domain for a specific resource group. There are
required and optional failover attributes, and you can also specify your
own strings as attributes.  </P
><P
><A
HREF="fpcontent.html#LE45720-PARENT"
>Table 3-1</A
> shows the required failover attributes.
 You must specify one and only one of these attributes. Note that the
starting conditions for the attributes differs:  for the required attributes,
the starting condition is that a node joins the cluster membership when
the cluster is already providing HA services; for the optional attributes,
the starting condition is that HA services are started and the resource
group is running in only one node in the cluster</P
><DIV
CLASS="TABLE"
><A
NAME="LE45720-PARENT"
></A
><P
><B
>Table 3-1. Required Failover Attributes (mutually exclusive)</B
></P
><TABLE
BORDER="1"
WIDTH="100%"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="34%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Name</P
></TH
><TH
WIDTH="66%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Description</P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="34%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>Auto_Failback</TT
></P
></TD
><TD
WIDTH="66%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Specifies that the resource group
is made online based on the failover policy when a node joins the cluster.
This attribute is best used when some type of load balancing is required.
You must specify either this attribute or the <TT
CLASS="LITERAL"
>Controlled_Failback</TT
> attribute.</P
></TD
></TR
><TR
><TD
WIDTH="34%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>Controlled_Failback</TT
></P
></TD
><TD
WIDTH="66%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Specifies that the resource group
remains on the same node when a node joins the cluster. This attribute
is best used when client/server applications have expensive recovery mechanisms,
such as databases or any application that uses <TT
CLASS="LITERAL"
>tcp</TT
>
to communicate. You must specify either this attribute or the <TT
CLASS="LITERAL"
>Auto_Failback</TT
> attribute.</P
></TD
></TR
></TBODY
></TABLE
></DIV
><P
>When defining a failover policy, you can optionally also choose
one and only one of the recovery attributes shown in <A
HREF="fpcontent.html#LE27762-PARENT"
>Table 3-2</A
>.
The recovery attribute determines the node on which a resource group will
be allocated when its state changes to online and a member of the group
is already allocated (such as when volumes are present).</P
><DIV
CLASS="TABLE"
><A
NAME="LE27762-PARENT"
></A
><P
><B
>Table 3-2. Optional Failover Attributes (mutually exclusive)</B
></P
><TABLE
BORDER="1"
WIDTH="100%"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="34%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Name</P
></TH
><TH
WIDTH="66%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Description</P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="34%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>Auto_Recovery</TT
></P
></TD
><TD
WIDTH="66%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Specifies that the resource group
is made online based on the failover policy even when an exclusivity check
shows that the resource group is running on a node. This attribute is
optional and is mutually exclusive with the <TT
CLASS="LITERAL"
>Inplace_Recovery</TT
> attribute. If you specify neither of these attributes, Linux
FailSafe will use this attribute by default if you have specified the <TT
CLASS="LITERAL"
>Auto_Failback</TT
> attribute.</P
></TD
></TR
><TR
><TD
WIDTH="34%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>InPlace_Recovery</TT
></P
></TD
><TD
WIDTH="66%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Specifies that the resource group
is made online on the same node where  the resource group is running.
This attribute is the default and is mutually exclusive with the <TT
CLASS="LITERAL"
>Auto_Recovery</TT
> attribute. If you specify neither of these attributes,
Linux FailSafe will use this attribute by default if you have specified
the <TT
CLASS="LITERAL"
>Controlled_Failback</TT
> attribute.</P
></TD
></TR
></TBODY
></TABLE
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1645"
>3.1.3. Failover Scripts</A
></H2
><P
> A
failover script generates the run-time failover domain and returns it
to the Linux FailSafe process. The Linux FailSafe process applies the
failover attributes and then selects the first node in the returned failover
domain that is also in the current node membership.</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The run-time of the failover script must be capped to a system-definable
maximum. Hence, any external calls must be guaranteed to return quickly.
If the failover script takes too long to return, Linux FailSafe will kill
the script process and use the previous run-time failover domain.</P
></BLOCKQUOTE
></DIV
><P
>Failover scripts are stored in the  <TT
CLASS="FILENAME"
>/usr/lib/failsafe/policies</TT
>  directory.</P
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN1661"
>3.1.3.1. The <TT
CLASS="FILENAME"
>ordered</TT
> Failover Script</A
></H3
><P
>The <TT
CLASS="LITERAL"
>ordered</TT
> failover
script is provided with the release. The <TT
CLASS="LITERAL"
>ordered</TT
> script
never changes the initial domain; when using this script, the initial
and run-time domains are equivalent. The script reads six lines from the
input file and in case of errors logs the input parameters and/or the
error to the script log.</P
><P
>The following example shows the contents of the <TT
CLASS="FILENAME"
>ordered</TT
> failover script. (Line breaks added for readability.)</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/sh
#
# Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.  Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
# Mountain View, CA 94043, or:
#
# http://www.sgi.com
#
# For further information regarding this notice, see:
#
# http://oss.sgi.com/projects/GenInfo/NoticeExplan

#
# $1 - input file
# $2 - output file
#
# line 1 input file - version
# line 2 input file - name
# line 3 input file - owner field
# line 4 input file - attributes
# line 5 input file - list of possible owners
# line 6 input file - application failover domain


DIR=/usr/lib/failsafe/bin
LOG="${DIR}/ha_cilog -g ha_script -s script"
FILE=/usr/lib/failsafe/policies/ordered

input=$1
output=$2

{
  read version
  read name
  read owner
  read attr
  read mem1 mem2 mem3 mem4 mem5 mem6 mem7 mem8
  read afd1 afd2 afd3 afd4 afd5 afd6 afd7 afd8
} &#60; ${input}


${LOG} -l 1 "${FILE}:" `/bin/cat ${input}`

if [ "${version}" -ne 1 ] ; then
    ${LOG} -l 1 "ERROR: ${FILE}: Different version no. Should be (1) rather than (${version})" ;
    exit 1;
elif [ -z "${name}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: Failover script not defined";
    exit 1;
elif [ -z "${attr}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: Attributes not defined";
    exit 1;
elif [ -z "${mem1}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: No node membership defined";
    exit 1;
elif [ -z "${afd1}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: No failover domain defined";
    exit 1;
fi

found=0
for i in $afd1 $afd2 $afd3 $afd4 $afd5 $afd6 $afd7 $afd8; do
    for j in $mem1 $mem2 $mem3 $mem4 $mem5 $mem6 $mem7 $mem8; do
        if [ "X${j}" = "X${i}" ]; then
            found=1;
            break;
        fi
    done
done


if [ ${found} -eq 0 ]; then
    mem="("$mem1")"" ""("$mem2")"" ""("$mem3")"" ""("$mem4")"" \
    ""("$mem5")"" ""("$mem6")"" ""("$mem7")"" ""("$mem8")";
    afd="("$afd1")"" ""("$afd2")"" ""("$afd3")"" ""("$afd4")"" \
    ""("$afd5")"" ""("$afd6")"" ""("$afd7")"" ""("$afd8")";
    ${LOG} -l 1 "ERROR: ${FILE}: Policy script failed"
    ${LOG} -l 1 "ERROR: ${FILE}: " `/bin/cat ${input}`
    ${LOG} -l 1 "ERROR: ${FILE}: Nodes defined in membership do not match \
    the ones in failure domain"
    ${LOG} -l 1 "ERROR: ${FILE}: Parameters read from input file: \
    version = $version, name = $name, owner = $owner,  attribute = $attr, \
    nodes = $mem, afd = $afd"
    exit 1;
fi


if [ ${found} -eq 1 ]; then
    rm -f ${output}
    echo $afd1 $afd2 $afd3 $afd4 $afd5 $afd6 $afd7 $afd8 &#62; ${output}
    exit 0
fi
exit 1</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN1673"
>3.1.3.2. The <TT
CLASS="FILENAME"
>round-robin </TT
>Failover Script</A
></H3
><P
>The <TT
CLASS="FILENAME"
>round-robin</TT
> script selects the resource
group owner in a round-robin (circular) fashion. This policy can be used
for resource groups that can be run in any node in the cluster.</P
><P
>The following example shows the contents of the <TT
CLASS="FILENAME"
>round-robin </TT
>failover script. </P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/sh
#
# Copyright (c) 2000 Silicon Graphics, Inc.  All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third person regarding infringement
# or the like.  Any license provided herein, whether implied or
# otherwise, applies only to this software file.  Patent licenses, if
# any, provided herein do not apply to combinations of this program with
# other software, or any other product whatsoever.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
# Mountain View, CA 94043, or:
#
# http://www.sgi.com
#
# For further information regarding this notice, see:
#
# http://oss.sgi.com/projects/GenInfo/NoticeExplan


#
# $1 - input file
# $2 - output file
#
# line 1 input file - version
# line 2 input file - name
# line 3 input file - owner field
# line 4 input file - attributes
# line 5 input file - Possible list of owners
# line 6 input file - application failover domain

DIR=/usr/lib/failsafe/bin
LOG="${DIR}/ha_cilog -g ha_script -s script"
FILE=/usr/lib/failsafe/policies/round-robin

# Read input file
input=$1
output=$2

{
  read version
  read name
  read owner
  read attr
  read mem1 mem2 mem3 mem4 mem5 mem6 mem7 mem8
  read afd1 afd2 afd3 afd4 afd5 afd6 afd7 afd8
} &#60; ${input}

# Validate input file
${LOG} -l 1 "${FILE}:" `/bin/cat ${input}`

if [ "${version}" -ne 1 ] ; then
    ${LOG} -l 1 "ERROR: ${FILE}: Different version no. Should be (1) \
    rather than (${version})" ;
    exit 1;
elif [ -z "${name}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: Failover script not defined";
    exit 1;
elif [ -z "${attr}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: Attributes not defined";
    exit 1;
elif [ -z "${mem1}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: No node membership defined";
    exit 1;
elif [ -z "${afd1}" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: No failover domain defined";
    exit 1;
fi



# Return 0 if $1 is in the membership and return 1 otherwise.
check_in_mem()
{
    for j in $mem1 $mem2 $mem3 $mem4 $mem5 $mem6 $mem7 $mem8; do
        if [ "X${j}" = "X$1" ]; then
            return 0;
        fi
    done
    return 1;
}

# Check if owner has to be changed. There is no need to change owner if
# owner node is in the possible list of owners.
check_in_mem ${owner}
if [ $? -eq 0 ]; then
    nextowner=${owner};
fi

# Search for the next owner
if [ "X${nextowner}" = "X" ]; then
    next=0;
    for i in $afd1 $afd2 $afd3 $afd4 $afd5 $afd6 $afd7 $afd8; do
        if [ "X${i}" = "X${owner}" ]; then
            next=1;
            continue;
        fi

        if [ "X${owner}" = "XNO ONE" ]; then
            next=1;
        fi

        if [ ${next} -eq 1 ]; then
            # Check if ${i} is in membership
            check_in_mem ${i};
            if [ $? -eq 0 ]; then
                # found next owner
                nextowner=${i};
                next=0;
                break;
            fi
        fi
    done
fi

if [ "X${nextowner}" = "X" ]; then
    # wrap round the afd list.
    for i in $afd1 $afd2 $afd3 $afd4 $afd5 $afd6 $afd7 $afd8; do
        if [ "X${i}" = "X${owner}" ]; then
            # Search for next owner complete
            break;
        fi

        # Previous loop should have found new owner
        if [ "X${owner}" = "XNO ONE" ]; then
            break;
        fi

        if [ ${next} -eq 1 ]; then
            check_in_mem ${i};
            if [ $? -eq 0 ]; then
                # found next owner
                nextowner=${i};
                next=0;
                break;
            fi
        fi
    done
fi

if [ "X${nextowner}" = "X" ]; then
    ${LOG} -l 1 "ERROR: ${FILE}: Policy script failed"
    ${LOG} -l 1 "ERROR: ${FILE}: " `/bin/cat ${input}`
    ${LOG} -l 1 "ERROR: ${FILE}: Could not find new owner"
    exit 1;
fi



# nextowner is the new owner
print=0;
rm -f ${output};

# Print the new afd to the output file
echo -n "${nextowner} " &#62; ${output};
for i in $afd1 $afd2 $afd3 $afd4 $afd5 $afd6 $afd7 $afd8;
do
    if [ "X${nextowner}" = "X${i}" ]; then
        print=1;
    elif [ ${print} -eq 1 ]; then
        echo -n "${i} " &#62;&#62; ${output}
    fi
done

print=1;
for i in $afd1 $afd2 $afd3 $afd4 $afd5 $afd6 $afd7 $afd8; do
    if [ "X${nextowner}" = "X${i}" ]; then
        print=0;
    elif [ ${print} -eq 1 ]; then
        echo -n "${i} " &#62;&#62; ${output}
    fi
done

echo &#62;&#62; ${output};
exit 0;</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN1681"
>3.1.3.3. Creating a New Failover Script</A
></H3
><P
>If the <TT
CLASS="LITERAL"
>ordered</TT
> or <TT
CLASS="FILENAME"
>round-robin</TT
>
scripts do not meet your needs, you can create a new failover script and
place it in the <TT
CLASS="FILENAME"
>/usr/lib/failsafe/policies</TT
> directory.
 You can then configure the cluster configuration database to use your
new failover script for the required resource groups.</P
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le16529-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="fpinterface.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Creating a Failover Policy</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le16529-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Failover Script Interface</TD
></TR
></TABLE
></DIV
></BODY
></HTML
> free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it would be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# Further, this software is distributed without any warranty that it is
# free of the rightful claim of any third pershtml/fpexample.html010064400016050000001000000202130717757011500152010ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Example Failover Policies for Linux FailSafe</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Creating a Failover Policy"
HREF="le16529-parent.html"><LINK
REL="PREVIOUS"
TITLE="Failover Script Interface"
HREF="fpinterface.html"><LINK
REL="NEXT"
TITLE="Defining a New Resource Type"
HREF="le43007-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="fpinterface.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 3. Creating a Failover Policy</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le43007-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="FPEXAMPLE"
>3.3. Example Failover Policies for Linux FailSafe</A
></H1
><P
>There are two general types of configuration, each of which can
have from 2 through 8 nodes:</P
><P
></P
><UL
><LI
><P
><TT
CLASS="REPLACEABLE"
><I
>N</I
></TT
> nodes that can potentially
failover their applications to any of the other nodes in the cluster. </P
></LI
><LI
><P
><TT
CLASS="REPLACEABLE"
><I
>N</I
></TT
> primary nodes that can failover
to <TT
CLASS="REPLACEABLE"
><I
>M</I
></TT
> backup nodes. For example, you could have
3 primary nodes and 1 backup node.</P
></LI
></UL
><P
>This section shows examples of failover policies for the following
types of configuration, each of which can have from 2 through 8 nodes:</P
><P
></P
><UL
><LI
><P
><TT
CLASS="REPLACEABLE"
><I
>N</I
></TT
> primary nodes and one backup
node (<TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>1)</P
></LI
><LI
><P
><TT
CLASS="REPLACEABLE"
><I
>N</I
></TT
> primary nodes and two backup
nodes (<TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>2)</P
></LI
><LI
><P
><TT
CLASS="REPLACEABLE"
><I
>N</I
></TT
> primary nodes and <TT
CLASS="REPLACEABLE"
><I
>M </I
></TT
>backup nodes (<TT
CLASS="REPLACEABLE"
><I
>N+M</I
></TT
>)</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The diagrams in the following sections illustrate the configuration
concepts discussed here, but they do not address all required or supported
elements, such as reset hubs. For configuration details, see the <I
CLASS="CITETITLE"
>Linux FailSafe Installation and Maintenance Instructions</I
>.</P
></BLOCKQUOTE
></DIV
></LI
></UL
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1767"
>3.3.1. N+1 Configuration for Linux FailSafe</A
></H2
><P
><A
HREF="fpexample.html#LE70211-PARENT"
>Figure 3-1</A
> shows a specific instance of an <TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>1 configuration in which there are three primary nodes
and one backup node. (This is also known as a <I
CLASS="FIRSTTERM"
>star configuration</I
>.) The disks shown could each be disk farms. </P
><P
><DIV
CLASS="FIGURE"
><A
NAME="LE70211-PARENT"
></A
><P
><B
>Figure 3-1. <TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>1 Configuration
Concept</B
></P
><P
><IMG
SRC="figures/star.configuration.gif"></P
></DIV
></P
><P
>You could configure the following failover policies for load balancing:</P
><P
></P
><UL
><LI
><P
>Failover policy for RG1:</P
><P
></P
><UL
><LI
><P
>Initial failover domain = A, D</P
></LI
><LI
><P
>Failover attribute = <TT
CLASS="LITERAL"
>Auto_Failback</TT
></P
></LI
><LI
><P
>Failover script = <TT
CLASS="LITERAL"
>ordered</TT
></P
></LI
></UL
></LI
><LI
><P
>Failover policy for RG2:</P
><P
></P
><UL
><LI
><P
>Initial failover domain = B, D</P
></LI
><LI
><P
>Failover attribute = <TT
CLASS="LITERAL"
>Auto_Failback</TT
></P
></LI
><LI
><P
>Failover script = <TT
CLASS="LITERAL"
>ordered</TT
></P
></LI
></UL
></LI
><LI
><P
>Failover policy for RG3:</P
><P
></P
><UL
><LI
><P
>Initial failover domain = C, D</P
></LI
><LI
><P
>Failover attribute = <TT
CLASS="LITERAL"
>Auto_Failback</TT
></P
></LI
><LI
><P
>Failover script = <TT
CLASS="LITERAL"
>ordered</TT
></P
></LI
></UL
></LI
></UL
><P
>If node A fails, RG1 will fail over to node D. As soon as node A
reboots, RG1 will be moved back to node A.</P
><P
>If you change the failover attribute to <TT
CLASS="LITERAL"
>Controlled_Failback</TT
> for RG1 and node A fails, RG1 will fail over to node D and
will remain running on node D even if node A reboots.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1823"
>3.3.2. N+2 Configuration</A
></H2
><P
><A
HREF="fpexample.html#LE15098-PARENT"
>Figure 3-2</A
> shows a specific instance of an
 <TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>2 configuration in which there are four
primary nodes and two backup nodes. The disks shown could each be disk
farms.   </P
><P
><DIV
CLASS="FIGURE"
><A
NAME="LE15098-PARENT"
></A
><P
><B
>Figure 3-2. <TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>2 Configuration
Concept</B
></P
><P
><IMG
SRC="figures/n.plus.2.configuration.gif"></P
></DIV
></P
><P
>You could configure the following failover policy for resource groups
RG7 and RG8:</P
><P
></P
><UL
><LI
><P
>Failover policy for RG7:</P
><P
></P
><UL
><LI
><P
>Initial failover domain = A, E, F</P
></LI
><LI
><P
>Failover attribute = <TT
CLASS="LITERAL"
>Controlled_Failback</TT
></P
></LI
><LI
><P
>Failover script =<TT
CLASS="LITERAL"
> ordered</TT
></P
></LI
></UL
></LI
><LI
><P
>Failover policy for RG8:</P
><P
></P
><UL
><LI
><P
>Initial failover domain = B, F, E</P
></LI
><LI
><P
>Failover attribute = <TT
CLASS="LITERAL"
>Auto_Failback</TT
></P
></LI
><LI
><P
>Failover script = <TT
CLASS="LITERAL"
>ordered</TT
></P
></LI
></UL
></LI
></UL
><P
>If node A fails, RG7 will fail over to node E. If node E also fails,
RG7 will fail over to node F. If A is rebooted, RG7 will remain on node
F.</P
><P
>If node B fails, RG8 will fail over to node F. If B is rebooted,
RG8 will return to node B.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1866"
>3.3.3. N+M Configuration for Linux FailSafe</A
></H2
><P
><A
HREF="fpexample.html#LE66765-PARENT"
>Figure 3-3</A
> shows a specific instance of an <TT
CLASS="REPLACEABLE"
><I
>N+M</I
></TT
> configuration in which there are four primary nodes
and each can serve as a backup node. The disk shown could be a disk farm.   </P
><P
><DIV
CLASS="FIGURE"
><A
NAME="LE66765-PARENT"
></A
><P
><B
>Figure 3-3. <TT
CLASS="REPLACEABLE"
><I
>N</I
></TT
>+<TT
CLASS="REPLACEABLE"
><I
>M</I
></TT
> Configuration Concept</B
></P
><P
><IMG
SRC="figures/square.configuration.gif"></P
></DIV
></P
><P
>You could configure the following failover policy for resource groups
RG5 and RG6:</P
><P
></P
><UL
><LI
><P
>Failover policy for RG5:</P
><P
></P
><UL
><LI
><P
>Initial failover domain = A, B, C, D</P
></LI
><LI
><P
>Failover attribute = <TT
CLASS="LITERAL"
>Controlled_Failback</TT
></P
></LI
><LI
><P
>Failover script = <TT
CLASS="LITERAL"
>ordered</TT
></P
></LI
></UL
></LI
><LI
><P
>Failover policy for RG6:</P
><P
></P
><UL
><LI
><P
>Initial failover domain = C, A, D</P
></LI
><LI
><P
>Failover attribute = <TT
CLASS="LITERAL"
>Controlled_Failback</TT
></P
></LI
><LI
><P
>Failover script = <TT
CLASS="LITERAL"
>ordered</TT
></P
></LI
></UL
></LI
></UL
><P
>If node C fails, RG6 will fail over to node A. When node C reboots,
RG6 will remain running on node A. If node A then fails, RG6 will return
to node C and RG5 will move to node B. If node B then fails, RG5 moves
to node C.</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="fpinterface.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le43007-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Failover Script Interface</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le16529-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Defining a New Resource Type</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/fpinterface.html010064400016050000001000000072540717757010600155200ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Failover Script Interface</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Creating a Failover Policy"
HREF="le16529-parent.html"><LINK
REL="PREVIOUS"
TITLE="Contents of a Failover Policy"
HREF="fpcontent.html"><LINK
REL="NEXT"
TITLE="Example Failover Policies for Linux FailSafe"
HREF="fpexample.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="fpcontent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 3. Creating a Failover Policy</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="fpexample.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="FPINTERFACE"
>3.2. Failover Script Interface</A
></H1
><P
>The following is passed to the failover script: </P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>function(<TT
CLASS="REPLACEABLE"
><I
>version</I
></TT
>, <TT
CLASS="REPLACEABLE"
><I
>name</I
></TT
>, <TT
CLASS="REPLACEABLE"
><I
>owner</I
></TT
>, <TT
CLASS="REPLACEABLE"
><I
>attributes</I
></TT
>, <TT
CLASS="REPLACEABLE"
><I
>possibleowners</I
></TT
>, <TT
CLASS="REPLACEABLE"
><I
>domain</I
></TT
>)</PRE
></TD
></TR
></TABLE
><P
></P
><DIV
CLASS="VARIABLELIST"
><DL
><DT
><TT
CLASS="REPLACEABLE"
><I
>version</I
></TT
></DT
><DD
><P
>Linux FailSafe version. The Linux FailSafe release uses version
number 1. </P
></DD
><DT
><TT
CLASS="REPLACEABLE"
><I
>name</I
></TT
></DT
><DD
><P
>Name of the failover script (used for error validations and logging
purposes).</P
></DD
><DT
><TT
CLASS="REPLACEABLE"
><I
>owner</I
></TT
></DT
><DD
><P
><TT
CLASS="REPLACEABLE"
><I
></I
></TT
>Logical name of the node that has the
resource group allocated.</P
></DD
><DT
><TT
CLASS="REPLACEABLE"
><I
>attributes</I
></TT
></DT
><DD
><P
>Failover attributes (<TT
CLASS="LITERAL"
>Auto_Failback</TT
> or <TT
CLASS="LITERAL"
>Controlled_Failback</TT
> must be included)</P
></DD
><DT
><TT
CLASS="REPLACEABLE"
><I
>possibleowners</I
></TT
></DT
><DD
><P
>List of possible owners for the resource group. This list can be
subset of the current node membership.</P
></DD
><DT
><TT
CLASS="REPLACEABLE"
><I
>domain</I
></TT
></DT
><DD
><P
>Ordered list of nodes used at the last failover. (At the first failover,
the initial failover domain is used.)</P
></DD
></DL
></DIV
><P
>The failover script returns the newly generated run-time failover
domain to Linux FailSafe, which then chooses the node on which the resource
group should be allocated by applying the failover attributes and node
membership to the run-time failover domain.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="fpcontent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="fpexample.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Contents of a Failover Policy</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le16529-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Example Failover Policies for Linux FailSafe</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/g3001.html010064400016050000001000000515000717757024500137610ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Glossary</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Print Exclusivity Check Messages"
HREF="x2982.html"><LINK
REL="NEXT"
TITLE="Index"
HREF="doc-index.html"></HEAD
><BODY
CLASS="GLOSSARY"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2982.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="doc-index.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="GLOSSARY"
><H1
><A
NAME="AEN3001"
>Glossary</A
></H1
><DL
><DT
><B
>action scripts</B
></DT
><DD
><P
>The set of scripts that determine how a resource is started, monitored,
and stopped. There must be a set of action scripts specified for each resource
type. The possible set of action scripts is:  <TT
CLASS="LITERAL"
>exclusive</TT
>, <TT
CLASS="LITERAL"
>start</TT
>, <TT
CLASS="LITERAL"
>stop</TT
>, <TT
CLASS="LITERAL"
>monitor</TT
>, and <TT
CLASS="LITERAL"
>restart</TT
>.</P
></DD
><DT
><B
>cluster</B
></DT
><DD
><P
>A collection of one or more cluster nodes coupled to each other by networks
or other similar interconnections. A cluster is identified by a simple name;
this name must be unique within the pool. A particular node may be a member
of only one cluster.</P
></DD
><DT
><B
>cluster administrator</B
></DT
><DD
><P
>The person responsible for managing and maintaining a cluster.</P
></DD
><DT
><B
>cluster configuration database</B
></DT
><DD
><P
>Contains configuration information about all resources, resource types,
resource groups, failover policies, nodes, and clusters.</P
></DD
><DT
><B
>cluster node</B
></DT
><DD
><P
>A single Linux execution environment.  In other words, a single physical
machine or single running Linux kernel.  In current Linux environments this
will be an individual computer. The term <I
CLASS="FIRSTTERM"
>node</I
> is used
within this guide to indicate this meaning, as opposed to any alternate meaning
such as a network node.</P
></DD
><DT
><B
>control messages</B
></DT
><DD
><P
>Messages that cluster software sends between the cluster nodes to request
operations on or distribute information about cluster nodes and resource groups.
Linux FailSafe sends control messages for the purpose of ensuring nodes and
groups remain highly available. Control messages and heartbeat messages are
sent through a node's network interfaces that have been attached to a control
network. A node can be attached to multiple control networks.</P
></DD
><DD
><P
>A node's control networks should not be set to accept control messages
if the node is not a dedicated Linux FailSafe node. Otherwise, end users who
run other jobs on the machine can have their jobs killed unexpectedly when
Linux FailSafe resets the node.</P
></DD
><DT
><B
>control network</B
></DT
><DD
><P
>The network that connects nodes through their network interfaces (typically
Ethernet) such that Linux FailSafe can maintain a cluster's high availability
by sending heartbeat messages and control messages through the network to
the attached nodes. Linux FailSafe uses the highest priority network interface
on the control network; it uses a network interface with lower priority when
all higher-priority network interfaces on the control network fail.</P
></DD
><DD
><P
>A node must have at least one control network interface for heartbeat
messages and one for control messages (both heartbeat and control messages
can be configured to use the same interface). A node can have no more than
eight control network interfaces.</P
></DD
><DT
><B
>database</B
></DT
><DD
><P
>See <I
CLASS="GLOSSTERM"
>cluster configuration database</I
></P
></DD
><DT
><B
>dependency list</B
></DT
><DD
><P
>See <I
CLASS="GLOSSTERM"
>resource dependency</I
> or <I
CLASS="GLOSSTERM"
>resource
type dependency</I
>.</P
></DD
><DT
><B
>failover</B
></DT
><DD
><P
>The process of allocating a resource group to another node according
to a failover policy. A failover may be triggered by the failure of a resource,
a change in the node membership (such as when a node fails or starts), or
a manual request by the administrator.</P
></DD
><DT
><B
>failover attribute</B
></DT
><DD
><P
>A string that affects the allocation of a resource group in a cluster.
The administrator must specify system-defined attributes (such as <TT
CLASS="LITERAL"
>Auto_Failback</TT
> or <TT
CLASS="LITERAL"
>Controlled_Failback</TT
>), and can
optionally supply site-specific attributes.</P
></DD
><DT
><B
>failover domain</B
></DT
><DD
><P
>The ordered list of nodes on which a particular resource group can be
allocated. The nodes listed in the failover domain must be within the same
cluster; however, the failover domain does not have to include every node
in the cluster.The administrator defines the initial failover domain when
creating a failover policy. This list is transformed into the run-time failover
domain by the failover script the run-time failover domain is what is actually
used to select the failover node. Linux FailSafe stores the run-time failover
domain and uses it as input to the next failover script invocation. The initial
and run-time failover domains may be identical, depending upon the contents
of the failover script. In general, Linux FailSafe allocates a given resource
group to the first node listed in the run-time failover domain that is also
in the node membership; the point at which this allocation takes place is
affected by the failover attributes.</P
></DD
><DT
><B
>failover policy</B
></DT
><DD
><P
>The method used by Linux FailSafe to determine the destination node
of a failover. A failover policy consists of a failover domain, failover attributes,
and a failover script. A failover policy name must be unique within the pool.</P
></DD
><DT
><B
>failover script</B
></DT
><DD
><P
>A failover policy component that generates a run-time failover domain
and returns it to the Linux FailSafe process. The process applies the failover
attributes and then selects the first node in the returned failover domain
that is also in the current node membership.</P
></DD
><DT
><B
>Failsafe database</B
></DT
><DD
><P
>See <I
CLASS="GLOSSTERM"
>cluster configuration database</I
></P
></DD
><DT
><B
>heartbeat messages</B
></DT
><DD
><P
>Messages that cluster software sends between the nodes that indicate
a node is up and running. Heartbeat messages and control messages are sent
through a node's network interfaces that have been attached to a control network.
A node can be attached to multiple control networks.</P
></DD
><DT
><B
>heartbeat interval</B
></DT
><DD
><P
>Interval between heartbeat messages. The node timeout value must be
at least 10 times the heartbeat interval for proper Linux FailSafe operation
(otherwise false failovers may be triggered). The higher the number of heartbeats
(smaller heartbeat interval), the greater the potential for slowing down the
network. Conversely, the fewer the number of heartbeats (larger heartbeat
interval), the greater the potential for reducing availability of resources.</P
></DD
><DT
><B
>initial failover domain</B
></DT
><DD
><P
>The ordered list of nodes, defined by the administrator when a failover
policy is first created, that is used the first time a cluster is booted.The
ordered list specified by the initial failover domain is transformed into
a run-time failover domain by the failover script; the run-time failover domain
is used along with failover attributes to determine the node on which a resource
group should reside. With each failure, the failover script takes the current
run-time failover domain and potentially modifies it; the initial failover
domain is never used again. Depending on the run-time conditions and contents
of the failover script, the initial and run-time failover domains may be identical.
See also <I
CLASS="GLOSSTERM"
>run-time failover domain</I
>.</P
></DD
><DT
><B
>key/value attribute</B
></DT
><DD
><P
>A set of information that must be defined for a particular resource
type. For example, for the resource type <TT
CLASS="LITERAL"
>filesystem</TT
> one
key/value pair might be <TT
CLASS="REPLACEABLE"
><I
>mount_point=/fs1</I
></TT
> where <TT
CLASS="REPLACEABLE"
><I
>mount_point</I
></TT
> is the key and <TT
CLASS="REPLACEABLE"
><I
>fs1</I
></TT
> is
the value specific to the particular resource being defined. Depending on
the value, you specify either a <TT
CLASS="LITERAL"
>string</TT
> or <TT
CLASS="LITERAL"
>integer</TT
> data type. In the previous example, you would specify <TT
CLASS="LITERAL"
>string</TT
> as the data type for the value <TT
CLASS="REPLACEABLE"
><I
>fs1</I
></TT
>.</P
></DD
><DT
><B
>log configuration</B
></DT
><DD
><P
>A log configuration has two parts: a log level and a log file, both
associated with a log group. The cluster administrator can customize the location
and amount of log output, and can specify a log configuration for all nodes
or for only one node. For example, the <TT
CLASS="LITERAL"
>crsd</TT
> log group can
be configured to log detailed level-10 messages to the <TT
CLASS="FILENAME"
>/var/log/failsafe/crsd_foo</TT
> log only on the
node <TT
CLASS="LITERAL"
>foo</TT
> and to write only minimal level-1 messages to
the <TT
CLASS="LITERAL"
>crsd</TT
> log on all other nodes.</P
></DD
><DT
><B
>log file</B
></DT
><DD
><P
>A file containing Linux FailSafe  notifications for a particular log
group. A log file is part of the log configuration for a log group. By default,
log files reside in the <TT
CLASS="FILENAME"
>/var/log/failsafe</TT
> directory,
but the cluster administrator can customize this. Note: Linux FailSafe logs
both normal operations and critical errors to <TT
CLASS="FILENAME"
>/var/log/failsafe</TT
>, as well as to individual
logs for specific log groups.</P
></DD
><DT
><B
>log group</B
></DT
><DD
><P
>A set of one or more Linux FailSafe processes that use the same log
configuration. A log group usually corresponds to one daemon, such as <TT
CLASS="LITERAL"
>gcd</TT
>.</P
></DD
><DT
><B
>log level</B
></DT
><DD
><P
>A number controlling the number of log messages that Linux FailSafe
will write into an associated log group's log file. A log level is part of
the log configuration for a log group.</P
></DD
><DT
><B
>node</B
></DT
><DD
><P
>See <I
CLASS="GLOSSTERM"
>cluster node</I
></P
></DD
><DT
><B
>node ID</B
></DT
><DD
><P
>A 16-bit positive integer that uniquely defines a cluster node. During
node definition, Linux FailSafe will assign a node ID if one has not been
assigned by the cluster administrator. Once assigned, the node ID cannot be
modified.</P
></DD
><DT
><B
>node membership</B
></DT
><DD
><P
>The list of nodes in a cluster on which Linux FailSafe can allocate
resource groups.</P
></DD
><DT
><B
>node timeout</B
></DT
><DD
><P
>If no heartbeat is received from a node in this period of time, the
node is considered to be dead. The node timeout value must be at least 10
times the heartbeat interval for proper Linux FailSafe operation (otherwise
false failovers may be triggered).</P
></DD
><DT
><B
>notification command</B
></DT
><DD
><P
>The command used to notify the cluster administrator of changes or failures
in the cluster, nodes, and resource groups. The command must exist on every
node in the cluster.</P
></DD
><DT
><B
>offline resource group</B
></DT
><DD
><P
>A resource group that is not highly available in the cluster. To put
a resource group in offline state, Linux FailSafe stops the group (if needed)
and stops monitoring the group. An offline resource group can be running on
a node, yet not under Linux FailSafe control. If the cluster administrator
specifies the <TT
CLASS="LITERAL"
>detach only</TT
> option while taking the group
offline, then Linux FailSafe will not stop the group but will stop monitoring
the group.</P
></DD
><DT
><B
>online resource group</B
></DT
><DD
><P
>A resource group that is highly available in the cluster. When Linux
FailSafe detects a failure that degrades the resource group availability,
it moves the resource group to another node in the cluster. To put a resource
group in online state, Linux FailSafe starts the group (if needed) and begins
monitoring the group. If the cluster administrator specifies the <I
CLASS="GLOSSTERM"
>attach only</I
> option while bringing the group online, then Linux
FailSafe will not start the group but will begin monitoring the group.</P
></DD
><DT
><B
>owner host</B
></DT
><DD
><P
>A system that can control a node remotely, for example power-cycling
the node.  At run time, the owner host must be defined as a node in the pool.</P
></DD
><DT
><B
>owner TTY name</B
></DT
><DD
><P
>The device file name of the terminal port (TTY) on the owner host to
which the system controller serial cable is connected. The other end of the
cable connects to the node with the system controller port, so the node can
be controlled remotely by the owner host.</P
></DD
><DT
><B
>pool</B
></DT
><DD
><P
>The entire set of nodes involved with a group of clusters. The group
of clusters are usually close together and should always serve a common purpose.
A replicated cluster configuration database is stored on each node in the
pool.</P
></DD
><DT
><B
>port password</B
></DT
><DD
><P
>The password for the system controller port, usually set once in firmware
or by setting jumper wires. (This is not the same as the node's <TT
CLASS="LITERAL"
>root</TT
> password.)</P
></DD
><DT
><B
>powerfail mode</B
></DT
><DD
><P
>When powerfail mode is turned <TT
CLASS="LITERAL"
>on</TT
>, Linux FailSafe
tracks the response from a node's system controller as it makes reset requests
to a cluster node. When these requests fail to reset the node successfully,
Linux FailSafe uses heuristics to try to estimate whether the machine has
been powered down. If the heuristic algorithm returns with success, Linux
FailSafe assumes the remote machine has been reset successfully. When powerfail
mode is turned <TT
CLASS="LITERAL"
>off</TT
>, the heuristics are not used and Linux
FailSafe may not be able to detect node power failures.</P
></DD
><DT
><B
>process group</B
></DT
><DD
><P
>A group of application instances.  Each application instance can consist
of one or more UNIX processes and spans only one node.</P
></DD
><DT
><B
>process membership</B
></DT
><DD
><P
>A list of process instances in a cluster that form a process group.
There can multiple process groups per node.</P
></DD
><DT
><B
>resource</B
></DT
><DD
><P
>A single physical or logical entity that provides a service to clients
or other resources. For example, a resource can be a single disk volume, a
particular network address, or an application such as a web server. A resource
is generally available for use over time on two or more nodes in a cluster,
although it can be allocated to only one node at any given time. Resources
are identified by a resource name and a resource type. Dependent resources
must be part of the same resource group and are identified in a resource dependency
list. </P
></DD
><DT
><B
>resource dependency</B
></DT
><DD
><P
>The condition in which a resource requires the existence of other resources.</P
></DD
><DT
><B
>resource dependency list</B
></DT
><DD
><P
>A list of resources upon which a resource depends. Each resource instance
must have resource dependencies that satisfy its resource type dependencies
before it can be added to a resource group.</P
></DD
><DT
><B
>resource group</B
></DT
><DD
><P
>A collection of resources. A resource group is identified by a simple
name; this name must be unique within a cluster. Resource groups cannot overlap;
that is, two resource groups cannot contain the same resource. All interdependent
resources must be part of the same resource group. If any individual resource
in a resource group becomes unavailable for its intended use, then the entire
resource group is considered unavailable. Therefore, a resource group is the
unit of failover.</P
></DD
><DT
><B
>resource keys</B
></DT
><DD
><P
>Variables that define a resource of a given resource type. The action
scripts use this information to start, stop, and monitor a resource of this
resource type.</P
></DD
><DT
><B
>resource name</B
></DT
><DD
><P
>The simple name that identifies a specific instance of a resource type.
A resource name must be unique within a given resource type.</P
></DD
><DT
><B
>resource type</B
></DT
><DD
><P
>A particular class of resource. All of the resources in a particular
resource type can be handled in the same way for the purposes of failover.
Every resource is an instance of exactly one resource type. A resource type
is identified by a simple name; this name must be unique within a cluster.
A resource type can be defined for a specific node or for an entire cluster.
A resource type that is defined for a node overrides a cluster-wide resource
type definition with the same name; this allows an individual node to override
global settings from a cluster-wide resource type definition.</P
></DD
><DT
><B
>resource type dependency</B
></DT
><DD
><P
>A set of resource types upon which a resource type depends. For example,
the <TT
CLASS="LITERAL"
>filesystem</TT
> resource
type depends upon the <TT
CLASS="LITERAL"
>volume</TT
> resource type, and the <TT
CLASS="LITERAL"
>Netscape_web</TT
> resource type depends upon the <TT
CLASS="LITERAL"
>filesystem</TT
> and <TT
CLASS="LITERAL"
>IP_address</TT
>
resource types.</P
></DD
><DT
><B
>resource type dependency list</B
></DT
><DD
><P
>A list of resource types upon which a resource type depends.</P
></DD
><DT
><B
>run-time failover domain</B
></DT
><DD
><P
>The ordered set of nodes on which the resource group can execute upon
failures, as modified by the failover script. The run-time failover domain
is used along with failover attributes to determine the node on which a resource
group should reside. See also <I
CLASS="GLOSSTERM"
>initial failover domain</I
>.</P
></DD
><DT
><B
>start/stop order</B
></DT
><DD
><P
>Each resource type has a start/stop order, which is a non&#8211;negative
integer. In a resource group, the start/stop orders of the resource types
determine the order in which the resources will be started when Linux FailSafe
brings the group online and will be stopped when Linux FailSafe takes the
group offline. The group's resources are started in increasing order, and
stopped in decreasing order; resources of the same type are started and stopped
in indeterminate order. For example, if resource type <TT
CLASS="LITERAL"
>volume</TT
>
has order 10 and resource type <TT
CLASS="LITERAL"
>filesystem</TT
> has order 20,
then when Linux FailSafe brings a resource group online, all volume resources
in the group will be started before all file system resources in the group.</P
></DD
><DT
><B
>system controller port</B
></DT
><DD
><P
>A port located on a node that provides a way to power-cycle the node
remotely. One example of this in the x86-based hardware arena is the Intel
EMP (Emergency Management Port) supplied on some Intel motherboards.  Enabling
or disabling a system controller port in the cluster configuration database
(CDB) tells Linux FailSafe whether it can perform operations on the system
controller port. (When the port is enabled, serial cables must attach the
port to another node, the owner host.) System controller port information
is optional for a node in the pool, but is required if the node will be added
to a cluster; otherwise resources running on that node never will be highly
available.</P
></DD
><DT
><B
>tie-breaker node</B
></DT
><DD
><P
>A node identified as a tie-breaker for Linux FailSafe  to use in the
process of computing node membership for the cluster, when exactly half the
nodes in the cluster are up and can communicate with each other. If a tie-breaker
node is not specified, Linux FailSafe will use the node with the lowest node
ID in the cluster as the tie-breaker node.</P
></DD
><DT
><B
>type-specific attribute</B
></DT
><DD
><P
>Required information used to define a resource of a particular resource
type. For example, for a resource of type <TT
CLASS="LITERAL"
>filesystem</TT
> you
must enter attributes for the resource's volume name (where the file system
is located) and specify options for how to mount the file system (for example,
as readable and writable).</P
></DD
></DL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2982.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="doc-index.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Print Exclusivity Check Messages</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Index</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>ter on which Linux FailSafe can allocate
resource groups.</P
></DD
><DT
><B
>node timeout</B
></DT
><DD
><P
>If no heartbeat is received from a node in this period of time, the
node is considehtml/i3254.html010064400016050000001000000026020717756750100137750ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Index</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Glossary"
HREF="g3001.html"></HEAD
><BODY
CLASS="INDEX"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="g3001.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
>&nbsp;</TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><H1
><A
NAME="AEN3254"
>Index</A
></H1
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="g3001.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Glossary</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/index.html010064400016050000001000000166350717757025300143470ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
></TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="NEXT"
TITLE="About This Guide"
HREF="le21374-parent.html"></HEAD
><BODY
CLASS="BOOK"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="BOOK"
><A
NAME="AEN1"
></A
><DIV
CLASS="TITLEPAGE"
><H1
CLASS="TITLE"
><A
NAME="AEN3"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</A
></H1
><H3
CLASS="OTHERCREDIT"
><A
NAME="AEN8"
>Written by Joshua Rodman of SuSE, Inc. and Lori Johnson of SGI</A
></H3
><H3
CLASS="OTHERCREDIT"
><A
NAME="AEN10"
>Illustrated by Dany Galgani and Chris Wengelski</A
></H3
><H3
CLASS="OTHERCREDIT"
><A
NAME="AEN12"
>Production by  Diane Ciardelli and Adrian Daley </A
></H3
><H3
CLASS="OTHERCREDIT"
><A
NAME="AEN14"
>Engineering contributions by Rusty Ballinger, Franck Chastagnol,
Jeff Hanson, Vidula Iyer, Herbert Lewis, Michael Nishimoto,
Hugh Shannon Jr., Bill Sparks, Paddy Sreenivasan,
Dan Stekloff, Rebecca Underwood, Mayank Vasa, and Manish Verma </A
></H3
><A
HREF="ln16.html"
>Legal Notice</A
><HR></DIV
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="le21374-parent.html"
>About This Guide</A
></DT
><DD
><DL
><DT
>1. <A
HREF="x47.html"
>Audience</A
></DT
><DT
>2. <A
HREF="x51.html"
>Related Documentation</A
></DT
><DT
>3. <A
HREF="x117.html"
>Conventions Used in This Guide</A
></DT
></DL
></DD
><DT
>1. <A
HREF="le63369-parent.html"
>Introduction to Writing Application Scripts</A
></DT
><DD
><DL
><DT
>1.1. <A
HREF="le60545-parent.html"
>Concepts</A
></DT
><DT
>1.2. <A
HREF="le37432-parent.html"
>Highly Available Services Included with Linux
FailSafe</A
></DT
><DT
>1.3. <A
HREF="plugin.html"
>Plug-Ins</A
></DT
><DT
>1.4. <A
HREF="le56070-parent.html"
>Characteristics that Permit an Application to
be Highly Available</A
></DT
><DT
>1.5. <A
HREF="le37841-parent.html"
>Overview of the Programming Steps</A
></DT
></DL
></DD
><DT
>2. <A
HREF="le77672-parent.html"
>Writing the Action Scripts and Adding Monitoring
Agents</A
></DT
><DD
><DL
><DT
>2.1. <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
></DT
><DT
>2.2. <A
HREF="z942787505lhj.html"
>Understanding the Execution of Action Scripts</A
></DT
><DT
>2.3. <A
HREF="z942786569lhj.html"
>Preparation</A
></DT
><DT
>2.4. <A
HREF="z942786582lhj.html"
>Script Format</A
></DT
><DT
>2.5. <A
HREF="z942786601lhj.html"
>Steps in Writing a Script</A
></DT
><DT
>2.6. <A
HREF="le49536-parent.html"
>Examples of Action Scripts</A
></DT
><DT
>2.7. <A
HREF="z942786646lhj.html"
>Monitoring Agents</A
></DT
></DL
></DD
><DT
>3. <A
HREF="le16529-parent.html"
>Creating a Failover Policy</A
></DT
><DD
><DL
><DT
>3.1. <A
HREF="fpcontent.html"
>Contents of a Failover Policy</A
></DT
><DT
>3.2. <A
HREF="fpinterface.html"
>Failover Script Interface</A
></DT
><DT
>3.3. <A
HREF="fpexample.html"
>Example Failover Policies for Linux FailSafe</A
></DT
></DL
></DD
><DT
>4. <A
HREF="le43007-parent.html"
>Defining a New Resource Type</A
></DT
><DD
><DL
><DT
>4.1. <A
HREF="z943900385lhj.html"
>Using the GUI</A
></DT
><DT
>4.2. <A
HREF="z943900404lhj.html"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> Interactively</A
></DT
><DT
>4.3. <A
HREF="z943900431lhj.html"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> With a Script</A
></DT
><DT
>4.4. <A
HREF="z943901162lhj.html"
>Testing a New Resource Type</A
></DT
></DL
></DD
><DT
>5. <A
HREF="le96600-parent.html"
>Testing Scripts</A
></DT
><DD
><DL
><DT
>5.1. <A
HREF="x2321.html"
>General Testing and Debugging Techniques</A
></DT
><DT
>5.2. <A
HREF="z943900191lhj.html"
>Debugging Notes</A
></DT
><DT
>5.3. <A
HREF="x2401.html"
>Testing an Action Script</A
></DT
><DT
>5.4. <A
HREF="x2482.html"
>Special Testing Considerations for the <TT
CLASS="LITERAL"
>monitor</TT
> Script</A
></DT
></DL
></DD
><DT
>A. <A
HREF="z943897815lhj.html"
>Starting the FailSafe Manager</A
></DT
><DT
>B. <A
HREF="z944252972lhj.html"
>Using the SRM Script Library</A
></DT
><DD
><DL
><DT
>B.1. <A
HREF="x2568.html"
>Linux FailSafe application interfaces</A
></DT
><DT
>B.2. <A
HREF="x2618.html"
>Set Global Definitions</A
></DT
><DT
>B.3. <A
HREF="x2852.html"
>Check Arguments</A
></DT
><DT
>B.4. <A
HREF="x2876.html"
>Read an Input File</A
></DT
><DT
>B.5. <A
HREF="x2890.html"
>Execute a Command</A
></DT
><DT
>B.6. <A
HREF="x2912.html"
>Write Status for a Resource</A
></DT
><DT
>B.7. <A
HREF="x2932.html"
>Get the Value for a Field</A
></DT
><DT
>B.8. <A
HREF="x2946.html"
>Get the Value for Multiple Fields</A
></DT
><DT
>B.9. <A
HREF="x2955.html"
>Get Resource Information</A
></DT
><DT
>B.10. <A
HREF="x2982.html"
>Print Exclusivity Check Messages</A
></DT
></DL
></DD
><DT
><A
HREF="g3001.html"
>Glossary</A
></DT
><DT
><A
HREF="doc-index.html"
>Index</A
></DT
></DL
></DIV
><DIV
CLASS="LOT"
><DL
CLASS="LOT"
><DT
><B
>List of Tables</B
></DT
><DT
>1-1. <A
HREF="le60545-parent.html#LE99232-PARENT"
>Example Resource Group</A
></DT
><DT
>2-1. <A
HREF="z942787505lhj.html#Z943038525LHJ-PARENT"
>Differences Between the <TT
CLASS="LITERAL"
>monitor</TT
>
and <TT
CLASS="LITERAL"
>exclusive</TT
> Action Scripts</A
></DT
><DT
>2-2. <A
HREF="z942787505lhj.html#LE81926-PARENT"
>Successful Action Script Results</A
></DT
><DT
>2-3. <A
HREF="z942787505lhj.html#LE53980-PARENT"
>Failure of an Action Script</A
></DT
><DT
>3-1. <A
HREF="fpcontent.html#LE45720-PARENT"
>Required Failover Attributes (mutually exclusive)</A
></DT
><DT
>3-2. <A
HREF="fpcontent.html#LE27762-PARENT"
>Optional Failover Attributes (mutually exclusive)</A
></DT
><DT
>4-1. <A
HREF="le43007-parent.html#LE10480-PARENT"
>Order Ranges</A
></DT
><DT
>4-2. <A
HREF="le43007-parent.html#LE30764-PARENT"
>Resource Type Order Numbers</A
></DT
></DL
></DIV
><DIV
CLASS="LOT"
><DL
CLASS="LOT"
><DT
><B
>List of Figures</B
></DT
><DT
>2-1. <A
HREF="z942786646lhj.html#Z943376870LHJ"
>Monitoring Process</A
></DT
><DT
>3-1. <A
HREF="fpexample.html#LE70211-PARENT"
><TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>1 Configuration
Concept</A
></DT
><DT
>3-2. <A
HREF="fpexample.html#LE15098-PARENT"
><TT
CLASS="REPLACEABLE"
><I
>N+</I
></TT
>2 Configuration
Concept</A
></DT
><DT
>3-3. <A
HREF="fpexample.html#LE66765-PARENT"
><TT
CLASS="REPLACEABLE"
><I
>N</I
></TT
>+<TT
CLASS="REPLACEABLE"
><I
>M</I
></TT
> Configuration Concept</A
></DT
><DT
>4-1. <A
HREF="z943900385lhj.html#Z942424847GLEN"
>Select <SPAN
CLASS="INTERFACE"
>Define a New Resource</SPAN
></A
></DT
><DT
>4-2. <A
HREF="z943900385lhj.html#Z942424883GLEN"
>Specify the Name of the New Resource Type</A
></DT
><DT
>4-3. <A
HREF="z943900385lhj.html#Z942424567GLEN"
>Specify Settings for Required Actions</A
></DT
><DT
>4-4. <A
HREF="z943900385lhj.html#Z942424823GLEN"
>Change Settings for Optional Actions</A
></DT
><DT
>4-5. <A
HREF="z943900385lhj.html#Z942424617GLEN"
>Set Type-specific Attributes</A
></DT
><DT
>4-6. <A
HREF="z943900385lhj.html#Z942424684GLEN"
>Add Dependencies</A
></DT
><DT
>A-1. <A
HREF="z943897815lhj.html#Z942424754GLEN"
>FailSafe Manager</A
></DT
></DL
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le21374-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>About This Guide</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>A
HREF="le63369-parent.html"
>Introduction to Writing Application Scripts</A
></DT
><DD
><DL
><DT
>html/le16529-parent.html010064400016050000001000000054370717757011500155310ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Creating a Failover Policy</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Monitoring Agents"
HREF="z942786646lhj.html"><LINK
REL="NEXT"
TITLE="Contents of a Failover Policy"
HREF="fpcontent.html"></HEAD
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z942786646lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="fpcontent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="LE16529-PARENT"
>Chapter 3. Creating a Failover Policy</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
>3.1. <A
HREF="fpcontent.html"
>Contents of a Failover Policy</A
></DT
><DD
><DL
><DT
>3.1.1. <A
HREF="fpcontent.html#AEN1522"
>Failover Domain</A
></DT
><DT
>3.1.2. <A
HREF="fpcontent.html#AEN1567"
>Failover Attributes</A
></DT
><DT
>3.1.3. <A
HREF="fpcontent.html#AEN1645"
>Failover Scripts</A
></DT
></DL
></DD
><DT
>3.2. <A
HREF="fpinterface.html"
>Failover Script Interface</A
></DT
><DT
>3.3. <A
HREF="fpexample.html"
>Example Failover Policies for Linux FailSafe</A
></DT
><DD
><DL
><DT
>3.3.1. <A
HREF="fpexample.html#AEN1767"
>N+1 Configuration for Linux FailSafe</A
></DT
><DT
>3.3.2. <A
HREF="fpexample.html#AEN1823"
>N+2 Configuration</A
></DT
><DT
>3.3.3. <A
HREF="fpexample.html#AEN1866"
>N+M Configuration for Linux FailSafe</A
></DT
></DL
></DD
></DL
></DIV
><P
>This chapter tells you how to create a failover policy. It describes
the following topics:<P
></P
><UL
><LI
><P
><A
HREF="fpcontent.html"
>Section 3.1</A
></P
></LI
><LI
><P
><A
HREF="fpinterface.html"
>Section 3.2</A
></P
></LI
><LI
><P
><A
HREF="fpexample.html"
>Section 3.3</A
></P
></LI
></UL
></P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z942786646lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="fpcontent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Monitoring Agents</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Contents of a Failover Policy</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/le21374-parent.html010064400016050000001000000043650717756773200155350ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>About This Guide</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="NEXT"
TITLE="Audience"
HREF="x47.html"></HEAD
><BODY
CLASS="PREFACE"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="index.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x47.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="PREFACE"
><H1
><A
NAME="LE21374-PARENT"
>About This Guide</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
>1. <A
HREF="x47.html"
>Audience</A
></DT
><DT
>2. <A
HREF="x51.html"
>Related Documentation</A
></DT
><DT
>3. <A
HREF="x117.html"
>Conventions Used in This Guide</A
></DT
></DL
></DIV
><P
>This guide explains how to write the set of scripts that are required
to turn an application into a highly available service in conjunction
with Linux FailSafe software. It also tells you how to create a new resource
type.</P
><P
>This guide assumes that the Linux FailSafe system has been configured
as described in the <I
CLASS="CITETITLE"
>Linux FailSafe Administrator's Guide</I
>.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="index.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x47.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Audience</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/le37432-parent.html010064400016050000001000000037540717756776300155440ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Highly Available Services Included with Linux
FailSafe</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Introduction to Writing Application Scripts"
HREF="le63369-parent.html"><LINK
REL="PREVIOUS"
TITLE="Concepts"
HREF="le60545-parent.html"><LINK
REL="NEXT"
TITLE="Plug-Ins"
HREF="plugin.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le60545-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 1. Introduction to Writing Application Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="plugin.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="LE37432-PARENT"
>1.2. Highly Available Services Included with Linux
FailSafe</A
></H1
><P
>The base release includes the
software required to make IP addresses (the <TT
CLASS="LITERAL"
>IP_address</TT
>
resource type) highly available.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le60545-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="plugin.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Concepts</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le63369-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Plug-Ins</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>OLOR="#FFFFFF"
TEXT=html/le37841-parent.html010064400016050000001000000117770717756777500155570ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Overview of the Programming Steps</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Introduction to Writing Application Scripts"
HREF="le63369-parent.html"><LINK
REL="PREVIOUS"
TITLE="Characteristics that Permit an Application to
be Highly Available"
HREF="le56070-parent.html"><LINK
REL="NEXT"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le56070-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 1. Introduction to Writing Application Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le77672-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="LE37841-PARENT"
>1.5. Overview of the Programming Steps</A
></H1
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>If you do not want to write the scripts yourself, you can establish
a contract with the Silicon Graphics Professional Services group to create
customized scripts. See: <A
HREF="http://www.sgi.com/services/index.html"
TARGET="_top"
>http://www.sgi.com/services/index.html</A
>. </P
></BLOCKQUOTE
></DIV
><P
>To make an application highly available, follow these steps:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>Understand the application and determine:</P
><P
></P
><UL
><LI
><P
>The configuration required for the application, such as
user names, permissions, data location (volumes), and so on. For more
information about configuration, see the <I
CLASS="CITETITLE"
>Linux FailSafe Administrator's
Guide</I
>.</P
></LI
><LI
><P
>The other resources on which the application depends.
All interdependent resources must be part of the same resource group.</P
></LI
><LI
><P
>The resource type that best suits this application.</P
></LI
><LI
><P
>The number of instances of the resource type that will
constitute the application. (Each instance of a given application, or <I
CLASS="FIRSTTERM"
>resource type</I
>, is a separate resource.) For example, a web
server may depend upon two filesystem resources.</P
></LI
><LI
><P
>The commands and arguments required to start, stop, and
monitor this application (that is, the resources in the resource group).</P
></LI
><LI
><P
>The order in which all resources in the resource group
must be started and stopped.</P
></LI
></UL
></LI
><LI
><P
>Determine whether existing action scripts can be reused.
If they cannot, write a new set of action scripts, using existing scripts
and the templates in  <TT
CLASS="FILENAME"
>/usr/lib/failsafe/resource_types/template</TT
> as a guide. See <A
HREF="le77672-parent.html"
>Chapter 2</A
>.</P
></LI
><LI
><P
>Determine whether the existing <TT
CLASS="LITERAL"
>ordered</TT
>
or <TT
CLASS="LITERAL"
>round-robin</TT
> failover scripts can be reused for the
resource group. If they cannot, write a new failover script. See <A
HREF="le43007-parent.html"
>Chapter 4</A
>.</P
></LI
><LI
><P
>Determine whether an existing resource type can be reused.
If none applies, create a new resource type or modify an existing resource
type. See <A
HREF="le43007-parent.html"
>Chapter 4</A
>.</P
></LI
><LI
><P
>Configure the following in the cluster configuration database
(for more information, see the <I
CLASS="CITETITLE"
>Linux FailSafe Administrator's
Guide</I
>):</P
><P
></P
><UL
><LI
><P
>Resource group</P
></LI
><LI
><P
>Resource type</P
></LI
><LI
><P
>Failover policy</P
></LI
></UL
></LI
><LI
><P
>Test the action scripts and failover script. See <A
HREF="le96600-parent.html"
>Chapter 5</A
>, and <A
HREF="z943900191lhj.html"
>Section 5.2</A
>.</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>Do not modify the scripts included with the Linux FailSafe   product.
New or customized scripts must have different names from the files included
with the release.</P
></BLOCKQUOTE
></DIV
></LI
></OL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le56070-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Characteristics that Permit an Application to
be Highly Available</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le63369-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Writing the Action Scripts and Adding Monitoring
Agents</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/le43007-parent.html010064400016050000001000000231530717757014300155140ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Defining a New Resource Type</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Example Failover Policies for Linux FailSafe"
HREF="fpexample.html"><LINK
REL="NEXT"
TITLE="Using the GUI"
HREF="z943900385lhj.html"></HEAD
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="fpexample.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z943900385lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="LE43007-PARENT"
>Chapter 4. Defining a New Resource Type</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
>4.1. <A
HREF="z943900385lhj.html"
>Using the GUI</A
></DT
><DD
><DL
><DT
>4.1.1. <A
HREF="z943900385lhj.html#AEN2110"
>Define a New Resource Type</A
></DT
><DT
>4.1.2. <A
HREF="z943900385lhj.html#AEN2136"
>Define Dependencies</A
></DT
></DL
></DD
><DT
>4.2. <A
HREF="z943900404lhj.html"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> Interactively</A
></DT
><DT
>4.3. <A
HREF="z943900431lhj.html"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> With a Script</A
></DT
><DT
>4.4. <A
HREF="z943901162lhj.html"
>Testing a New Resource Type</A
></DT
></DL
></DIV
><P
>This chapter tells you how to define a new resource type:<P
></P
><UL
><LI
><P
><A
HREF="z943900385lhj.html"
>Section 4.1</A
></P
></LI
><LI
><P
><A
HREF="z943900404lhj.html"
>Section 4.2</A
></P
></LI
><LI
><P
><A
HREF="z943900431lhj.html"
>Section 4.3</A
></P
></LI
></UL
></P
><P
>It also tells you how to test the results in <A
HREF="z943901162lhj.html"
>Section 4.4</A
>.</P
><P
>To define a new resource type, you must have the following information:</P
><P
></P
><UL
><LI
><P
>Name of the resource type. The name can consist of alphanumeric
characters and any of the following:<P
CLASS="LITERALLAYOUT"
>-&nbsp;(hyphen)&nbsp;<br>
_&nbsp;(underscore)&nbsp;<br>
/&nbsp;<br>
.&nbsp;<br>
:&nbsp;<br>
"&nbsp;<br>
=<br>
@<br>
,&nbsp;</P
></P
><P
>The name cannot contain a space, an unprintable character, or any of
the following characters: <P
CLASS="LITERALLAYOUT"
>*<br>
?<br>
\<br>
#</P
></P
></LI
><LI
><P
>Name of the cluster to which the resource type will apply.</P
></LI
><LI
><P
>If the resource type is to be restricted to a specific node,
you must know the node name.</P
></LI
><LI
><P
>Order of performing the action scripts for resources of this
type in relation to resources of other types:</P
><P
></P
><UL
><LI
><P
>Resources are started in the increasing order of this value</P
></LI
><LI
><P
>Resources are stopped in the decreasing order of this value</P
><P
>Ensure that the number you choose for a new resource type permits the
resource types on which it depends to be started before it is started, or
stopped after it is stopped, as appropriate.</P
><P
><A
HREF="le43007-parent.html#LE10480-PARENT"
>Table 4-1</A
> shows the conventions used for order
ranges. The values available for customer use are 201-400 and 701-999.</P
><DIV
CLASS="TABLE"
><A
NAME="LE10480-PARENT"
></A
><P
><B
>Table 4-1. Order Ranges</B
></P
><TABLE
BORDER="1"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="14%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Range</P
></TH
><TH
WIDTH="86%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Reservation</P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="14%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>1-100</P
></TD
><TD
WIDTH="86%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>SGI-provided basic system resource
types, such as <TT
CLASS="LITERAL"
>MAC_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="14%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>101-200</P
></TD
><TD
WIDTH="86%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>SGI-provided system plug-ins that can
be started before <TT
CLASS="LITERAL"
>IP_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="14%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>201-400</P
></TD
><TD
WIDTH="86%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>User-defined resource types that can
be started before <TT
CLASS="LITERAL"
>IP_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="14%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>401-500</P
></TD
><TD
WIDTH="86%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>SGI-provided basic system resource
types, such as <TT
CLASS="LITERAL"
>IP_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="14%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>501-700</P
></TD
><TD
WIDTH="86%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>SGI-provided system plug-ins that must
be started after <TT
CLASS="LITERAL"
>IP_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="14%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>701-999</P
></TD
><TD
WIDTH="86%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>User-defined resource types that must
be started after <TT
CLASS="LITERAL"
>IP_address</TT
></P
></TD
></TR
></TBODY
></TABLE
></DIV
><P
><A
HREF="le43007-parent.html#LE30764-PARENT"
>Table 4-2</A
> shows the order numbers of the resource
types provided with the release or available as plug-ins from SGI.</P
><DIV
CLASS="TABLE"
><A
NAME="LE30764-PARENT"
></A
><P
><B
>Table 4-2. Resource Type Order Numbers</B
></P
><TABLE
BORDER="1"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="38%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Order Number</P
></TH
><TH
WIDTH="62%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Resource Type</P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="38%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>10</P
></TD
><TD
WIDTH="62%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>MAC_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="38%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>20</P
></TD
><TD
WIDTH="62%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>volume</TT
></P
></TD
></TR
><TR
><TD
WIDTH="38%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>30</P
></TD
><TD
WIDTH="62%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>filesystem</TT
></P
></TD
></TR
><TR
><TD
WIDTH="38%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>201</P
></TD
><TD
WIDTH="62%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>NFS</TT
></P
></TD
></TR
><TR
><TD
WIDTH="38%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>401</P
></TD
><TD
WIDTH="62%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>IP_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="38%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>411</P
></TD
><TD
WIDTH="62%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>statd</TT
></P
></TD
></TR
><TR
><TD
WIDTH="38%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>502</P
></TD
><TD
WIDTH="62%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>Samba</TT
></P
></TD
></TR
></TBODY
></TABLE
></DIV
></LI
></UL
></LI
><LI
><P
>Restart mode, which can be one of the following values: </P
><P
></P
><UL
><LI
><P
>0 = Do not restart on monitoring failures</P
></LI
><LI
><P
>1 = Restart a fixed number of times</P
></LI
></UL
></LI
><LI
><P
>Number of local restarts (when restart mode is 1).</P
></LI
><LI
><P
>Location of the executable script. This is always <TT
CLASS="FILENAME"
>/usr/lib/failsafe/resource_types/<TT
CLASS="REPLACEABLE"
><I
>resource_type_tname</I
></TT
></TT
> .</P
></LI
><LI
><P
>Monitoring interval, which is the time period (in milliseconds)
between successive executions of the <TT
CLASS="LITERAL"
>monitor</TT
> action script;
this is only valid for the <TT
CLASS="LITERAL"
>monitor</TT
> action script.</P
></LI
><LI
><P
>Starting time for monitoring. When the resource group is made
online in a cluster node, Linux FailSafe will start monitoring the resources
after the specified time period (in milliseconds).</P
></LI
><LI
><P
>Action scripts to be defined for this resource type. You must
specify scripts for <TT
CLASS="LITERAL"
>start</TT
>, <TT
CLASS="LITERAL"
>stop</TT
>, <TT
CLASS="LITERAL"
>exclusive</TT
>, and <TT
CLASS="LITERAL"
>monitor</TT
>, although the <TT
CLASS="LITERAL"
>monitor</TT
> script may contain only a return-success function if you
wish. If you specify 1 for the restart mode, you must specify a <TT
CLASS="LITERAL"
>restart</TT
> script.</P
></LI
><LI
><P
>Type-specific attributes to be defined for this resource type.
The action scripts use this information to start, stop, and monitor a resource
of this resource type. For example, NFS requires the following resource keys:</P
><P
></P
><UL
><LI
><P
><TT
CLASS="LITERAL"
>export-info</TT
> which takes a value that defines
the export options for the file system. These options are used in the <B
CLASS="COMMAND"
>kexportfs</B
> command. For example:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>export-info = rw,wsync,anon=root</PRE
></TD
></TR
></TABLE
></LI
><LI
><P
><TT
CLASS="LITERAL"
>filesystem</TT
> which takes a value that defines
the raw file system. This name is used as input to the <B
CLASS="COMMAND"
>mount</B
>
command. For example:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>filesystem = /dev/xlv/xlv_object</PRE
></TD
></TR
></TABLE
></LI
></UL
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="fpexample.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z943900385lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Example Failover Policies for Linux FailSafe</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Using the GUI</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/le49536-parent.html010064400016050000001000000350600717757006300155320ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Examples of Action Scripts</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="PREVIOUS"
TITLE="Steps in Writing a Script"
HREF="z942786601lhj.html"><LINK
REL="NEXT"
TITLE="Monitoring Agents"
HREF="z942786646lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z942786601lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z942786646lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="LE49536-PARENT"
>2.6. Examples of Action Scripts</A
></H1
><P
>The following sections use portions of the NFS scripts as examples. </P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The examples in this guide may not exactly match the released system.</P
></BLOCKQUOTE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1354"
>2.6.1. <TT
CLASS="LITERAL"
>start</TT
> Script</A
></H2
><P
>The NFS <TT
CLASS="LITERAL"
>start</TT
> script does the following:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>&#8194;Creates a resource-specific NFS status directory.</P
></LI
><LI
><P
>&#8194;Exports the specified export-point with the specified
export-options.</P
></LI
></OL
><P
>Following is a section from the NFS <TT
CLASS="LITERAL"
>start</TT
> script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># Start the resource on the local machine.
# Return HA_SUCCESS if the resource has been successfully started on the local
# machine and HA_CMD_FAILED otherwise.
#
start_nfs()
{
    ${HA_DBGLOG} "Entry: start_nfs()";

    # for all nfs resources passed as parameter
    for resource in ${HA_RES_NAMES}
    do
        NFSFILEDIR=${HA_SCRIPTTMPDIR}/${LOCAL_TEST_KEY}$resource
        HA_CMD="mkdir -p $NFSFILEDIR";
        ha_execute_cmd "creating nfs status file directory";
        if [ $? -ne 0 ]; then
           ${HA_LOG} "Failed to create ${NFSFILEDIR} directory";
           ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
           exit_script $HA_NOCFGINFO
        fi

        get_nfs_info $resource
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: $resource parameters not present in CDB";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi

        ha_get_field "${HA_STRING}" export-info
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: export-info not present in CDB for resource $resource";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi
        export_opts="$HA_FIELD_VALUE"

        ha_get_field "${HA_STRING}" filesystem
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: filesystem-info not present in CDB for resource $resource";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi
        filesystem="$HA_FIELD_VALUE"

        # Before we try and export the NFS resource, make sure
        # filesystem is mounted.
        HA_CMD="grep $filesystem /etc/mtab &#62; /dev/null 2&#62;&#38;1";
        ha_execute_cmd "check if the filesystem $filesystem is mounted";
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: filesystem $filesystem not mounted";
            ha_write_status_for_resource ${resource}  ${HA_CMD_FAILED};
            exit_script ${HA_CMD_FAILED};
        fi

        # Now do the job: export the new directory
        # Note: the export_dir command will check wether this directory
        # is already exported or not.
        HA_CMD="export_dir ${resource} ${export_opts}";
        ha_execute_cmd "export $resource directories to NFS clients";
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: could not export resoure ${resource}"
            ha_write_status_for_resource ${resource} ${HA_CMD_FAILED};
            exit_script ${HA_CMD_FAILED};
        else
            ha_write_status_for_resource ${resource} ${HA_SUCCESS};
        fi

    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1372"
>2.6.2. <TT
CLASS="LITERAL"
>stop</TT
> Script</A
></H2
><P
>The NFS <TT
CLASS="LITERAL"
>stop</TT
> script does the following:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>Unexports the specified export-point.</P
></LI
><LI
><P
>Removes the NFS status directory.</P
></LI
></OL
><P
>Following is an example from the NFS <TT
CLASS="LITERAL"
>stop</TT
> script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># Stop the nfs resource on the local machine.
# Return HA_SUCCESS if the resource has been successfully stopped on the local
# machine and HA_CMD_FAILED otherwise.
#
stop_nfs()
{

    ${HA_DBGLOG} "Entry: stop_nfs()";

    # for all nfs resources passed as parameter
    for resource in ${HA_RES_NAMES}
    do
        get_nfs_info ${resource}
        if [ $? -ne 0 ]; then
            # NFS resource information not available.
            ${HA_LOG} "NFS: $resource parameters not present in CDB";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi

        ha_get_field "${HA_STRING}" export-info
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: export-info not present in CDB for resource $resource";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi
        export_opts="$HA_FIELD_VALUE"


        # Unexport the directory
        HA_CMD="unexport_dir ${resource}"
        ha_execute_cmd "unexport ${resource} directory to NFS clients"
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: Failed to unexport resource ${resource}"
            ha_write_status_for_resource ${resource} ${HA_CMD_FAILED}
        fi

        ha_write_status_for_resource ${resource} ${HA_SUCCESS}
    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1390"
>2.6.3. <TT
CLASS="LITERAL"
>monitor</TT
> Script</A
></H2
><P
>The NFS <TT
CLASS="LITERAL"
>monitor</TT
> script does the following:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>Verifies that the file system is mounted at the correct mount
point.</P
></LI
><LI
><P
>Requests the status of the exported file system.</P
></LI
><LI
><P
>Checks the export-point.</P
></LI
><LI
><P
>Requests NFS statistics and (based on the results) make a
Remote Procedure Call (RPC) to NFS as needed.</P
></LI
></OL
><P
>Following is an example from the NFS <TT
CLASS="LITERAL"
>monitor</TT
> script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># Check if the nfs resource is allocated in the local node
# This check must be light weight and less intrusive compared to
# exclusive check. This check is done when the resource has been
# allocated in the local node.
# Return HA_SUCCESS if the resource is running in the local node
# and HA_CMD_FAILED if the resource is not running in the local node
# The list of the resources passed as input is in variable
# $HA_RES_NAMES
#
monitor_nfs()
{
    ${HA_DBGLOG} "Entry: monitor_nfs()";

    for resource in ${HA_RES_NAMES}
    do
        get_nfs_info ${resource}
        if [ $? -ne 0 ]; then
            # No resource information available.
            ${HA_LOG} "NFS: ${resource} parameters not present in CDB";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi

        ha_get_field "${HA_STRING}" filesystem
        if [ $? -ne 0 ]; then
            # filesystem not available available.
            ${HA_LOG} "NFS: filesystem not present in CDB for resource $resource";
	    ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi
        fs="$HA_FIELD_VALUE";

        # Check to see if the filesystem is mounted
        HA_CMD="mount | grep ${fs} &#62;/dev/null 2&#62;&#38;1"
        ha_execute_cmd "check to see if $fs is mounted"
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: ${fs} not mounted";
            ha_write_status_for_resource ${resource} ${HA_CMD_FAILED};
            exit_script $HA_CMD_FAILED;
        fi

        # stat the filesystem
        HA_CMD="fs_stat -r ${resource} &#62;/dev/null 2&#62;&#38;1";
        ha_execute_cmd "stat mount point $resource"
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: cannot stat ${resource} NFS export point";
            ha_write_status_for_resource ${resource} ${HA_CMD_FAILED};
            exit_script $HA_CMD_FAILED;
        fi

        # check the filesystem is exported
        showmount -e | grep "${resource} " &#62;/dev/null 2&#62;&#38;1
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: failed to find ${resource} in exported filesystem list:-"
            ${HA_LOG} "`showmount -e`"
            ha_write_status_for_resource ${resource} ${HA_CMD_FAILED}
            exit_script ${HA_CMD_FAILED}
        fi

        # check the NFS daemon is still alive and responding
        exec_rpcinfo;
        if [ $? -ne 0 ]; then
                ${HA_LOG} "NFS: exec_rpcinfo failed";
                ha_write_status_for_resource ${resource} ${HA_CMD_FAILED}
                exit_script $HA_CMD_FAILED
        fi

        # Check the stats ?
        # To Be Done... but there is no nfsstat command
        # for the user space NFS daemon.


        ha_write_status_for_resource $resource $HA_SUCCESS;
    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1412"
>2.6.4. <TT
CLASS="LITERAL"
>exclusive</TT
> Script</A
></H2
><P
>The NFS <TT
CLASS="LITERAL"
>exclusive</TT
> script determines whether the file
system is already exported. The check made by an exclusive script can be more
expensive than a monitor check. Linux FailSafe uses this script to determine
if resources are running on a node in the cluster, and to thereby prevent
starting resources on multiple nodes in the cluster.</P
><P
>Following is an example from the NFS <TT
CLASS="LITERAL"
>exclusive </TT
>script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># Check if the nfs resource is running in the local node. This check can
# more intrusive than the monitor check. This check is used to determine
# if the resource has to be started on a machine in the cluster.
# Return HA_NOT_RUNNING if the resource is not running in the local node
# and HA_RUNNING if the  resource is running in the local node
# The list of nfs resources passed as input is in variable
# $HA_RES_NAMES
#
exclusive_nfs()
{

    ${HA_DBGLOG} "Entry: exclusive_nfs()";

    # for all resources passed as parameter
    for resource in ${HA_RES_NAMES}
    do
        get_nfs_info $resource
        if [ $? -ne 0 ]; then
            # No resource information available
            ${HA_LOG} "NFS: $resource parameters not present in CDB";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi

        # Check if resource is already exported by the NFS server
        showmount -e | grep "${resource} " &#62;/dev/null 2&#62;&#38;1
        if [ $? -eq 0 ];then
            ha_write_status_for_resource ${resource} ${HA_RUNNING};
            ha_print_exclusive_status ${resource} ${HA_RUNNING};
        else
            ha_write_status_for_resource ${resource} ${HA_NOT_RUNNING};
            ha_print_exclusive_status ${resource} ${HA_NOT_RUNNING};
        fi

    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1425"
>2.6.5. <TT
CLASS="LITERAL"
>restart</TT
> Script</A
></H2
><P
>The NFS <TT
CLASS="LITERAL"
>restart</TT
> script exports the specified export-point
with the specified export-options.</P
><P
>Following is an example from the <TT
CLASS="LITERAL"
>restart</TT
> script for
NFS:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># Restart nfs resource
# Return HA_SUCCESS if nfs resource failed over successfully or
# return HA_CMD_FAILED if nfs resource could not be failed over locally.
# The list of nfs resources passed as input is in variable
# $HA_RES_NAMES
#
restart_nfs()
{
    ${HA_DBGLOG} "Entry: restart_nfs()";

    # for all nfs resources passed as parameter
    for resource in ${HA_RES_NAMES}
    do
        get_nfs_info $resource
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: $resource parameters not present in CDB";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi

        ha_get_field "${HA_STRING}" export-info
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: export-info not present in CDB for resource $resource";
            ha_write_status_for_resource ${resource} ${HA_NOCFGINFO};
            exit_script ${HA_NOCFGINFO};
        fi
        export_opts="$HA_FIELD_VALUE"


        # Note: the export_dir command will check wether this directory
        # is already exported or not.
        HA_CMD="export_dir ${resource} ${export_opts}";
        ha_execute_cmd "export $resource directories to NFS clients";
        if [ $? -ne 0 ]; then
            ${HA_LOG} "NFS: could not export resoure ${resource}"
            ha_write_status_for_resource ${resource} ${HA_CMD_FAILED};
            exit_script ${HA_CMD_FAILED};
        else
            ha_write_status_for_resource ${resource} ${HA_SUCCESS};
        fi

    done
}</PRE
></TD
></TR
></TABLE
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z942786601lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z942786646lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Steps in Writing a Script</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Monitoring Agents</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>rce} ${HA_SUCCESS};
        fi

    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1372"
>2.6.2. <TT
CLASS="LITERAL"
>stop</TT
> Script</A
></H2
><P
>The NFS <TT
CLASS="LITERAL"
>stop</TT
> script does the following:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>Unexports the specified export-point.</P
></LI
><LI
><P
>Removes the NFS status directory.</P
></LI
></OL
><P
>Following is an example from the NFS <TT
CLASS="LITERALhtml/le56070-parent.html010064400016050000001000000072170717756777000155370ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Characteristics that Permit an Application to
be Highly Available</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Introduction to Writing Application Scripts"
HREF="le63369-parent.html"><LINK
REL="PREVIOUS"
TITLE="Plug-Ins"
HREF="plugin.html"><LINK
REL="NEXT"
TITLE="Overview of the Programming Steps"
HREF="le37841-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="plugin.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 1. Introduction to Writing Application Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le37841-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="LE56070-PARENT"
>1.4. Characteristics that Permit an Application to
be Highly Available</A
></H1
><P
>The characteristics of an application that can be made highly available
are as follows:</P
><P
></P
><UL
><LI
><P
>The application can be easily restarted and monitored.</P
><P
>It should be able to recover from failures as does most client/server
software. The failure could be a hardware failure, an operating system
failure, or an application failure. If a node crashed and reboots, client/server
software should be able to attach again automatically.</P
></LI
><LI
><P
>The application must have a start and stop procedure.</P
><P
>When the application fails over, the instances of the application
are stopped on one node using the stop procedure and restarted on the
other node using the start procedure. </P
></LI
><LI
><P
>The application can be moved from one node to another
after failures.</P
><P
>If the resource has failed, it must still be possible to run the
resource stop procedure. In addition, the resource must recover from the
failed state when the resource start procedure is executed in another
node.</P
><P
>Ensure that there is no affinity for a specific node. </P
></LI
><LI
><P
>The application does not depend on knowing the primary
host name (as returned by <B
CLASS="COMMAND"
>hostname</B
>); that is, required
resources can be configured to work with an IP address.</P
></LI
><LI
><P
>Other resources on which the application depends can be
made highly available. If they are not provided by Linux FailSafe   and
its optional products (see <A
HREF="le37432-parent.html"
>Section 1.2</A
>), you must
make these resources highly available, using the information in this guide.</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>An application itself is not modified to make it highly available.</P
></BLOCKQUOTE
></DIV
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="plugin.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le37841-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Plug-Ins</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le63369-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Overview of the Programming Steps</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/le60545-parent.html010064400016050000001000000363370717756776000155450ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Concepts</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Introduction to Writing Application Scripts"
HREF="le63369-parent.html"><LINK
REL="PREVIOUS"
TITLE="Introduction to Writing Application Scripts"
HREF="le63369-parent.html"><LINK
REL="NEXT"
TITLE="Highly Available Services Included with Linux
FailSafe"
HREF="le37432-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le63369-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 1. Introduction to Writing Application Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le37432-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="LE60545-PARENT"
>1.1. Concepts</A
></H1
><P
>In order to use Linux FailSafe, you must understand the concepts
in this section.</P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN192"
>1.1.1. Cluster Node (or Node)</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>cluster node</I
> is a single Linux execution
environment. In other words, a single physical or virtual machine.  In
current Linux environments this will always be an individual computer.
The term <I
CLASS="FIRSTTERM"
>node</I
> is used to indicate this meaning
in this guide for brevity, as opposed to any meaning such as a network
node.  </P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN201"
>1.1.2. Pool</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>pool</I
> is the entire set of nodes having
 membership in a group of clusters. The clusters are usually close together
and should always serve a common purpose. A replicated cluster configuration
database is stored on each node in the pool. </P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN207"
>1.1.3. Cluster</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>cluster</I
> is a collection of one or more
nodes coupled to each other by networks or other similar interconnections.
A cluster belongs to one pool and only one pool.  A cluster is identified
by a simple name; this name must be unique within the pool.  A particular
node may be a member of only one cluster. All nodes in a cluster are also
in the pool; however, all nodes in the pool are not necessarily in the
cluster.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN213"
>1.1.4. Node Membership</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>node membership</I
> is the list of nodes in
a cluster on which Linux FailSafe can allocate resource  groups. </P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN221"
>1.1.5. Process Membership</A
></H2
><P
>A  <I
CLASS="FIRSTTERM"
>process membership</I
>
is the list of process instances in a cluster that form a process group.
There can be multiple process groups per node.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN228"
>1.1.6. Resource</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>resource</I
> is a single physical or logical
entity that provides a service to clients or other resources. For example,
a resource can be a single disk volume, a particular network address,
or an application such as a web server. A resource is generally available
for use over time on two or more nodes in a cluster, although it can only
be allocated to one node at any given time. </P
><P
>Resources are identified by a resource name and a resource type.
One resource can be dependent on one or more other resources; if so, it
will not be able to start (that is, be made available for use) unless
the dependent resources are also started. Dependent resources must be
part of the same resource group and are identified in a resource dependency
list.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN236"
>1.1.7. Resource Type</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>resource type</I
> is a particular class of
resource. All of the resources in a particular resource type can be handled
in the same way for the purposes of failover. Every resource is an instance
of exactly one resource type.</P
><P
>A resource type is identified by a simple name; this name should
be unique within the cluster. A resource type can be defined for a specific
node, or it can be defined for an entire cluster. A resource type definition
for a specific node overrides a clusterwide resource type definition with
the same name; this allows an individual node to override global settings
from a clusterwide resource type definition.</P
><P
>Like resources, a resource type can be dependent on one or more
other resource types. If such a dependency exists, at least one instance
of each of the dependent resource types must be defined. For example,
a resource type named <TT
CLASS="LITERAL"
>Netscape_web</TT
> might have resource
type dependencies on resource types named <TT
CLASS="LITERAL"
>IP_address</TT
>
and <TT
CLASS="LITERAL"
>volume</TT
>. If a resource named <TT
CLASS="LITERAL"
>web1</TT
>
is defined with the <TT
CLASS="LITERAL"
>Netscape_web</TT
> resource type, then
the resource group containing <TT
CLASS="LITERAL"
>web1</TT
> must also contain
at least one resource of the type <TT
CLASS="LITERAL"
>IP_address</TT
> and one
resource of the type <TT
CLASS="LITERAL"
>volume</TT
>.</P
><P
>The Linux FailSafe software includes some predefined resource types.
If these types fit the application you want to make highly available,
you can reuse them. If none fit, you can create additional resource types
by using the instructions in this guide.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN254"
>1.1.8. Resource Name</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>resource name</I
> identifies a specific instance
of a resource type. A resource name must be unique for a given resource
type.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN261"
>1.1.9. Resource Group</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>resource group</I
> is a collection of interdependent
resources. A resource group is identified by a simple name; this name
must be unique within a cluster.  <A
HREF="le60545-parent.html#LE99232-PARENT"
>Table 1-1</A
> shows
an example of the resources and their corresponding resource types for
a resource group named <TT
CLASS="LITERAL"
>WebGroup.</TT
> </P
><DIV
CLASS="TABLE"
><A
NAME="LE99232-PARENT"
></A
><P
><B
>Table 1-1. Example Resource Group</B
></P
><TABLE
BORDER="1"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="50%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Resource</P
></TH
><TH
WIDTH="50%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Resource Type</P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>10.10.48.22</TT
></P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>IP_address</TT
></P
></TD
></TR
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>/fs1</TT
></P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>filesystem</TT
></P
></TD
></TR
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>vol1</TT
></P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>volume</TT
></P
></TD
></TR
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>web1</TT
></P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>Netscape_web</TT
></P
></TD
></TR
></TBODY
></TABLE
></DIV
><P
>If any individual resource in a resource group becomes unavailable
for its intended use, then the entire resource group is considered unavailable.
Therefore, a resource group is the unit of failover.</P
><P
>Resource groups cannot overlap; that is, two resource groups cannot
contain the same resource.</P
><P
>For information about configuring resource groups, see the <I
CLASS="CITETITLE"
>Linux FailSafe Administrator's Guide</I
>.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN314"
>1.1.10. Resource Dependency List</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>resource dependency list</I
> is a list of resources
upon which a resource depends. Each resource instance must have resource
dependencies that satisfy its resource type dependencies before it can
be added to a resource group.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN318"
>1.1.11. Resource Type Dependency List</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>resource type dependency list</I
> is a list
of resource types upon which a resource type depends. For example, the <TT
CLASS="LITERAL"
>filesystem</TT
> resource type depends upon the <TT
CLASS="LITERAL"
>volume</TT
>
resource type, and the <TT
CLASS="LITERAL"
>Netscape_web</TT
> resource type depends
upon the <TT
CLASS="LITERAL"
>filesystem</TT
> and <TT
CLASS="LITERAL"
>IP_address</TT
>
resource types. </P
><P
>For example, suppose a file system instance <TT
CLASS="LITERAL"
>fs1</TT
>
is mounted on volume <TT
CLASS="LITERAL"
>vol1</TT
>. Before <TT
CLASS="LITERAL"
>fs1</TT
>
can be added to a resource group, <TT
CLASS="LITERAL"
>fs1</TT
> must be defined
to depend on <TT
CLASS="LITERAL"
>vol1</TT
>. Linux FailSafe only knows that a
file system instance must have one volume instance in its dependency list.
This requirement is inferred from the resource type dependency list. </P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN341"
>1.1.12. Failover</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>failover</I
> is the process of allocating a
resource group (or application) to another node, according to a failover
policy. A failover may be triggered by the failure of a resource, a change
in the node membership (such as when a node fails or starts), or a manual
request by the administrator.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN347"
>1.1.13. Failover Policy</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>failover policy</I
> is the method used by Linux
FailSafe to determine the destination node of a failover. A failover policy
consists of the following:</P
><P
></P
><UL
><LI
><P
>Failover domain</P
></LI
><LI
><P
>Failover attributes</P
></LI
><LI
><P
>Failover script</P
></LI
></UL
><P
>Linux FailSafe uses the failover domain output from a failover script
along with failover attributes to determine on which node a resource group
should reside.</P
><P
>The administrator must configure a failover policy for each resource
group. A failover policy name must be unique within the pool. Linux FailSafe
includes predefined failover policies, but youcan define your own failover
algorithms as well. </P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN362"
>1.1.14. Failover Domain</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>failover domain</I
> is the ordered list of
nodes on which a given resource group can be allocated. The nodes listed
in the failover domain must be within the same cluster; however, the failover
domain does not have to include every node in the cluster.   &#8194;</P
><P
>The administrator defines the initial failover domain when creating
a failover policy. This list is transformed into a run-time failover domain
by the failover script; Linux FailSafe uses the run-time failover domain
along with failover attributes and the node membership to determine the
node on which a resource group should reside. Linux FailSafe stores the
run-time failover domain and uses it as input to the next failover script
invocation. Depending on the run-time conditions and contents of the failover
script, the initial and run-time failover domains may be identical.</P
><P
>In general, Linux FailSafe allocates a given resource group to the
first node listed in the run-time failover domain that is also in the
node membership; the point at which this allocation takes place is affected
by the failover attributes.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN374"
>1.1.15. Failover Attribute</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>failover attribute</I
> is a string that affects
the allocation of a resource group in a cluster. The administrator must
specify system attributes (such as <TT
CLASS="LITERAL"
>Auto_Failback</TT
> or <TT
CLASS="LITERAL"
>Controlled_Failback</TT
>), and can optionally supply site-specific
attributes.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN382"
>1.1.16. Failover Scripts</A
></H2
><P
>A <I
CLASS="FIRSTTERM"
>failover script</I
> is a shell script that
generates a run-time failover domain and returns it to the Linux FailSafe
process. The Linux FailSafe process <TT
CLASS="LITERAL"
>ha_fsd</TT
> applies
the failover attributes and then selects the first node in the returned
failover domain that is also in the current node membership.</P
><P
>The following failover scripts are provided with the Linux FailSafe
release:</P
><P
></P
><UL
><LI
><P
><TT
CLASS="FILENAME"
>ordered</TT
>, which never changes the
initial failover domain. When using this script, the initial and run-time
failover domains are equivalent.</P
></LI
><LI
><P
><TT
CLASS="FILENAME"
>round-robin</TT
>, which selects the resource
group owner in a round-robin (circular) fashion. This policy can be used
for resource groups that can be run in any node in the cluster.</P
></LI
></UL
><P
>If these scripts do not meet your needs, you can create a new failover
script using the information in this guide.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN399"
>1.1.17. Action Scripts</A
></H2
><P
>The <I
CLASS="FIRSTTERM"
>action scripts</I
> are the set of scripts
that determine how a resource is started, monitored, and stopped. There
must be a set of action scripts specified for each resource type.</P
><P
>The following is the complete set of action scripts that can be
specified for each resource type:</P
><P
></P
><UL
><LI
><P
><TT
CLASS="LITERAL"
>exclusive</TT
>, which verifies that a resource
is not already running</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>start</TT
>, which starts a resource</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>stop</TT
>, which stops a resource</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>monitor</TT
>, which monitors a resource</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>restart</TT
>, which restarts a resource
on the same server after a monitoring failure occurs</P
></LI
></UL
><P
>The release includes action scripts for predefined resource types.
If these scripts fit the resource type that you want to make highly available,
you can reuse them by copying them and modifying them as needed. If none
fits, you can create additional action scripts by using the instructions
in this guide.</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le63369-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le37432-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Introduction to Writing Application Scripts</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le63369-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Highly Available Services Included with Linux
FailSafe</TD
></TR
></TABLE
></DIV
></BODY
></HTML
> with the <TT
CLASS="LITERAL"
>Netscape_web</TT
> resource type, then
the resource group containing <TT
CLASS="LITERAL"
>web1</TT
> must also contain
at least one resource of the type <TT
CLASS="LITERAL"
>IP_address</TT
> and one
resource of the type <TT
CLASS="LITERAL"
>volume</TT
>.</P
html/le63369-parent.html010064400016050000001000000105750717756777500155560ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Introduction to Writing Application Scripts</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Conventions Used in This Guide"
HREF="x117.html"><LINK
REL="NEXT"
TITLE="Concepts"
HREF="le60545-parent.html"></HEAD
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x117.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le60545-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="LE63369-PARENT"
>Chapter 1. Introduction to Writing Application Scripts</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
>1.1. <A
HREF="le60545-parent.html"
>Concepts</A
></DT
><DD
><DL
><DT
>1.1.1. <A
HREF="le60545-parent.html#AEN192"
>Cluster Node (or Node)</A
></DT
><DT
>1.1.2. <A
HREF="le60545-parent.html#AEN201"
>Pool</A
></DT
><DT
>1.1.3. <A
HREF="le60545-parent.html#AEN207"
>Cluster</A
></DT
><DT
>1.1.4. <A
HREF="le60545-parent.html#AEN213"
>Node Membership</A
></DT
><DT
>1.1.5. <A
HREF="le60545-parent.html#AEN221"
>Process Membership</A
></DT
><DT
>1.1.6. <A
HREF="le60545-parent.html#AEN228"
>Resource</A
></DT
><DT
>1.1.7. <A
HREF="le60545-parent.html#AEN236"
>Resource Type</A
></DT
><DT
>1.1.8. <A
HREF="le60545-parent.html#AEN254"
>Resource Name</A
></DT
><DT
>1.1.9. <A
HREF="le60545-parent.html#AEN261"
>Resource Group</A
></DT
><DT
>1.1.10. <A
HREF="le60545-parent.html#AEN314"
>Resource Dependency List</A
></DT
><DT
>1.1.11. <A
HREF="le60545-parent.html#AEN318"
>Resource Type Dependency List</A
></DT
><DT
>1.1.12. <A
HREF="le60545-parent.html#AEN341"
>Failover</A
></DT
><DT
>1.1.13. <A
HREF="le60545-parent.html#AEN347"
>Failover Policy</A
></DT
><DT
>1.1.14. <A
HREF="le60545-parent.html#AEN362"
>Failover Domain</A
></DT
><DT
>1.1.15. <A
HREF="le60545-parent.html#AEN374"
>Failover Attribute</A
></DT
><DT
>1.1.16. <A
HREF="le60545-parent.html#AEN382"
>Failover Scripts</A
></DT
><DT
>1.1.17. <A
HREF="le60545-parent.html#AEN399"
>Action Scripts</A
></DT
></DL
></DD
><DT
>1.2. <A
HREF="le37432-parent.html"
>Highly Available Services Included with Linux
FailSafe</A
></DT
><DT
>1.3. <A
HREF="plugin.html"
>Plug-Ins</A
></DT
><DT
>1.4. <A
HREF="le56070-parent.html"
>Characteristics that Permit an Application to
be Highly Available</A
></DT
><DT
>1.5. <A
HREF="le37841-parent.html"
>Overview of the Programming Steps</A
></DT
></DL
></DIV
><P
>Linux FailSafe provides several highly available services for a
two&#8211;node cluster. These services are monitored by the Linux FailSafe
software. You can create additional services that are highly available
by using the instructions in this guide.</P
><P
>This chapter provides an introduction to Linux FailSafe programming.
The sections are as follows:</P
><P
></P
><UL
><LI
><P
><A
HREF="le60545-parent.html"
>Section 1.1</A
></P
></LI
><LI
><P
><A
HREF="le37432-parent.html"
>Section 1.2</A
></P
></LI
><LI
><P
><A
HREF="plugin.html"
>Section 1.3</A
></P
></LI
><LI
><P
><A
HREF="le37841-parent.html"
>Section 1.5</A
></P
></LI
><LI
><P
><A
HREF="le56070-parent.html"
>Section 1.4</A
></P
></LI
><LI
><P
><A
HREF="le37841-parent.html"
>Section 1.5</A
></P
></LI
></UL
><P
>For an overview of the software layers, communication paths, and
cluster configuration database, see the <I
CLASS="CITETITLE"
>Linux FailSafe Administrator's
Guide</I
>.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x117.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le60545-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Conventions Used in This Guide</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Concepts</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/le77672-parent.html010064400016050000001000000126260717757006700155430ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Writing the Action Scripts and Adding Monitoring
Agents</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Overview of the Programming Steps"
HREF="le37841-parent.html"><LINK
REL="NEXT"
TITLE="Set of Action Scripts"
HREF="z942786554lhj.html"></HEAD
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le37841-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z942786554lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="LE77672-PARENT"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
>2.1. <A
HREF="z942786554lhj.html"
>Set of Action Scripts</A
></DT
><DT
>2.2. <A
HREF="z942787505lhj.html"
>Understanding the Execution of Action Scripts</A
></DT
><DD
><DL
><DT
>2.2.1. <A
HREF="z942787505lhj.html#Z944249968LHJ"
>Multiple Instances of Script Executed at the Same
Time</A
></DT
><DT
>2.2.2. <A
HREF="z942787505lhj.html#Z943309055LHJ"
>Differences between the <TT
CLASS="FILENAME"
>exclusive</TT
> and <TT
CLASS="FILENAME"
>monitor</TT
> Scripts</A
></DT
><DT
>2.2.3. <A
HREF="z942787505lhj.html#Z942863078LHJ"
>Successful Execution of Action Scripts</A
></DT
><DT
>2.2.4. <A
HREF="z942787505lhj.html#Z944596365SMG"
>Failure of Action Scripts</A
></DT
><DT
>2.2.5. <A
HREF="z942787505lhj.html#Z944596427SMG"
>Implementing Timeouts and Retrying a Command</A
></DT
><DT
>2.2.6. <A
HREF="z942787505lhj.html#Z944596453SMG"
>Sending UNIX Signals</A
></DT
></DL
></DD
><DT
>2.3. <A
HREF="z942786569lhj.html"
>Preparation</A
></DT
><DD
><DL
><DT
>2.3.1. <A
HREF="z942786569lhj.html#LE54960-PARENT"
>Is Monitoring Necessary?</A
></DT
><DT
>2.3.2. <A
HREF="z942786569lhj.html#AEN1031"
>Types of Monitoring</A
></DT
><DT
>2.3.3. <A
HREF="z942786569lhj.html#AEN1046"
>What are the Symptoms of Monitoring Failure?</A
></DT
><DT
>2.3.4. <A
HREF="z942786569lhj.html#AEN1059"
>How Often Should Monitoring Occur?</A
></DT
><DT
>2.3.5. <A
HREF="z942786569lhj.html#AEN1072"
>Examples of Testing for Monitoring Failure</A
></DT
></DL
></DD
><DT
>2.4. <A
HREF="z942786582lhj.html"
>Script Format</A
></DT
><DD
><DL
><DT
>2.4.1. <A
HREF="z942786582lhj.html#AEN1147"
>Header Information</A
></DT
><DT
>2.4.2. <A
HREF="z942786582lhj.html#AEN1157"
>Set Local Variables</A
></DT
><DT
>2.4.3. <A
HREF="z942786582lhj.html#AEN1177"
>Read Resource Information</A
></DT
><DT
>2.4.4. <A
HREF="z942786582lhj.html#AEN1206"
>Exit Status</A
></DT
><DT
>2.4.5. <A
HREF="z942786582lhj.html#AEN1237"
>Basic Action</A
></DT
><DT
>2.4.6. <A
HREF="z942786582lhj.html#AEN1254"
>Set Global Variables</A
></DT
><DT
>2.4.7. <A
HREF="z942786582lhj.html#AEN1271"
>Verify Arguments</A
></DT
><DT
>2.4.8. <A
HREF="z942786582lhj.html#AEN1287"
>Read Input File</A
></DT
><DT
>2.4.9. <A
HREF="z942786582lhj.html#AEN1303"
>Complete the Action</A
></DT
></DL
></DD
><DT
>2.5. <A
HREF="z942786601lhj.html"
>Steps in Writing a Script</A
></DT
><DT
>2.6. <A
HREF="le49536-parent.html"
>Examples of Action Scripts</A
></DT
><DD
><DL
><DT
>2.6.1. <A
HREF="le49536-parent.html#AEN1354"
><TT
CLASS="LITERAL"
>start</TT
> Script</A
></DT
><DT
>2.6.2. <A
HREF="le49536-parent.html#AEN1372"
><TT
CLASS="LITERAL"
>stop</TT
> Script</A
></DT
><DT
>2.6.3. <A
HREF="le49536-parent.html#AEN1390"
><TT
CLASS="LITERAL"
>monitor</TT
> Script</A
></DT
><DT
>2.6.4. <A
HREF="le49536-parent.html#AEN1412"
><TT
CLASS="LITERAL"
>exclusive</TT
> Script</A
></DT
><DT
>2.6.5. <A
HREF="le49536-parent.html#AEN1425"
><TT
CLASS="LITERAL"
>restart</TT
> Script</A
></DT
></DL
></DD
><DT
>2.7. <A
HREF="z942786646lhj.html"
>Monitoring Agents</A
></DT
></DL
></DIV
><P
>This chapter provides information about writing the action scripts required
to make an application highly available and how to add monitoring agents.
It discusses the following topics:</P
><P
></P
><UL
><LI
><P
><A
HREF="z942786554lhj.html"
>Section 2.1</A
></P
></LI
><LI
><P
><A
HREF="z942787505lhj.html"
>Section 2.2</A
></P
></LI
><LI
><P
><A
HREF="z942786569lhj.html"
>Section 2.3</A
></P
></LI
><LI
><P
><A
HREF="z942786582lhj.html"
>Section 2.4</A
></P
></LI
><LI
><P
><A
HREF="z942786601lhj.html"
>Section 2.5</A
></P
></LI
><LI
><P
><A
HREF="le49536-parent.html"
>Section 2.6</A
></P
></LI
><LI
><P
><A
HREF="z942786646lhj.html"
>Section 2.7</A
></P
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le37841-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z942786554lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Overview of the Programming Steps</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Set of Action Scripts</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/le96600-parent.html010064400016050000001000000050240717757016000155170ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Testing Scripts</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Testing a New Resource Type"
HREF="z943901162lhj.html"><LINK
REL="NEXT"
TITLE="General Testing and Debugging Techniques"
HREF="x2321.html"></HEAD
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z943901162lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2321.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="LE96600-PARENT"
>Chapter 5. Testing Scripts</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
>5.1. <A
HREF="x2321.html"
>General Testing and Debugging Techniques</A
></DT
><DT
>5.2. <A
HREF="z943900191lhj.html"
>Debugging Notes</A
></DT
><DT
>5.3. <A
HREF="x2401.html"
>Testing an Action Script</A
></DT
><DT
>5.4. <A
HREF="x2482.html"
>Special Testing Considerations for the <TT
CLASS="LITERAL"
>monitor</TT
> Script</A
></DT
></DL
></DIV
><P
>This chapter describes how to test action scripts without running Linux FailSafe. It also provides tips on how to debug problems that you may encounter.<DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>Parameters are passed to the action scripts as both input files and output files. Each line of the input file contains the resource name; the output file contains the resource name and the script exit status.</P
></BLOCKQUOTE
></DIV
></P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z943901162lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2321.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Testing a New Resource Type</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>General Testing and Debugging Techniques</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/ln16.html010064400016050000001000000075020717756771000140150ustar00gfergother00002640000003<HTML
><HEAD
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="NEXT"
TITLE="About This Guide"
HREF="le21374-parent.html"></HEAD
><BODY
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="LEGALNOTICE"
><A
NAME="AEN16"
></A
><P
></P
><P
> 2000 Silicon Graphics, Inc.; All rights reserved</P
><P
></P
></DIV
><DIV
CLASS="LEGALNOTICE"
><A
NAME="AEN18"
></A
><P
><B
>NOTICE:</B
></P
><P
>This documentation, in electronic format, is provided as is without
any warranty or condition of any kind, either express, implied, or statutory,
including, but not limited to, any warranty or condition that it constitutes
specifications to which any related software will conform, any implied
warranties or conditions, on the documentation and related software, of
merchantability, satisfactory quality, fitness for a particular purpose,
and freedom from infringement, and any warranty or condition that the
related software will be error free. In no event shall SGI or its suppliers
be liable for any damages, including, but not limited to direct, indirect,
special or consequential damages, arising out of, resulting from, or in
any way connected with this documentation and related software, whether
or not based upon warranty, contract, tort or otherwise, whether or not
injury was sustained by persons or property or otherwise, and whether
or not loss was sustained from, or arose out of the results of, or use
of, the documentation and related software. </P
><P
>Silicon Graphics, Inc. grants the user permission to reproduce,
distribute, and create derivative works from the documentation, provided
that: (1) the user reproduces this entire notice within both source and
binary format redistributions in printed or electronic format; and (2)
no further license or permission may be inferred or deemed or construed
to exist with regard to the sample code or the code base of which it forms
a part.  </P
><P
>Contact information:  Silicon Graphics, Inc., 1600 Amphitheatre
Pkwy, Mountain View, CA  94043, or: </P
><P
><TT
CLASS="LITERAL"
>http://www.sgi.com</TT
></P
></DIV
><DIV
CLASS="LEGALNOTICE"
><A
NAME="AEN25"
></A
><P
><B
>LIMITED RIGHTS LEGEND</B
></P
><P
>The electronic (software) version of this document was developed
at private expense; if acquired under an agreement with the USA government
or any contractor thereto, it is acquired as "commercial computer software"
subject to the provisions of its applicable license agreement, as specified
in (a) 48 CFR 12.212 of the FAR; or, if acquired for Department of Defense
units, (b) 48 CFR 227-7202 of the DoD FAR Supplement; or sections succeeding
thereto.  Contractor/manufacturer is Silicon Graphics, Inc., 1600 Amphitheatre
Pkwy 2E, Mountain View, CA 94043-1351.</P
></DIV
><DIV
CLASS="LEGALNOTICE"
><A
NAME="AEN28"
></A
><P
><B
>TRADEMARKS</B
></P
><P
>SGI, the SGI logo, IRIS FailSafe, SGI FailSafe, SGI Linux, and 
Linux FailSafe are trademarks of Silicon Graphics, Inc.  Linux a registered
trademark of Linux Torvalds, used with permission by Silicon Graphics,
Inc.  SuSE is a trademark of SuSE Inc.  All other trademarks mentioned
are the property of their respective owners.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
></TABLE
></DIV
></BODY
></HTML
> shall SGI or its suppliers
be liable for any damages, including, but not limited to direct, indirect,
special or consequential damages, arising out of, resulting from, or in
any way connecthtml/plugin.html010064400016050000001000000062550717756776600145520ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Plug-Ins</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Introduction to Writing Application Scripts"
HREF="le63369-parent.html"><LINK
REL="PREVIOUS"
TITLE="Highly Available Services Included with Linux
FailSafe"
HREF="le37432-parent.html"><LINK
REL="NEXT"
TITLE="Characteristics that Permit an Application to
be Highly Available"
HREF="le56070-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le37432-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 1. Introduction to Writing Application Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le56070-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="PLUGIN"
>1.3. Plug-Ins</A
></H1
><P
>Optional software packages, known as <I
CLASS="FIRSTTERM"
>plug-ins</I
>,
are available to make additional applications highly available. </P
><P
>The following plug-ins are available for Linux FailSafe:</P
><P
></P
><UL
><LI
><P
>Logical volumes (the <TT
CLASS="LITERAL"
>volume</TT
> resource
type) such as provided by <TT
CLASS="LITERAL"
>LVM</TT
>  </P
></LI
><LI
><P
>Filesystems such as <TT
CLASS="LITERAL"
>reiserfs</TT
> and <TT
CLASS="LITERAL"
>ext2fs</TT
> (the <TT
CLASS="LITERAL"
>filesystem</TT
> resource type)
 </P
></LI
><LI
><P
>MAC addresses (the <TT
CLASS="LITERAL"
>MAC_address</TT
> resource
type) </P
></LI
><LI
><P
>Linux FailSafe Samba</P
></LI
><LI
><P
>Linux FailSafe NFS </P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>Linux FailSafe NFS is not part of the core Linux FailSafe software,
but it is documented with the base release.</P
></BLOCKQUOTE
></DIV
></LI
></UL
><P
>If you want to create new highly available services, or change the
functionality of the provided failover scripts and action scripts by writing
new scripts, you will use the instructions in this guide. However, not
all resources can be made highly available; see <A
HREF="le56070-parent.html"
>Section 1.4</A
>.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le37432-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le56070-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Highly Available Services Included with Linux
FailSafe</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le63369-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Characteristics that Permit an Application to
be Highly Available</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x117.html010064400016050000001000000056230717756773200137430ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Conventions Used in This Guide</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="About This Guide"
HREF="le21374-parent.html"><LINK
REL="PREVIOUS"
TITLE="Related Documentation"
HREF="x51.html"><LINK
REL="NEXT"
TITLE="Introduction to Writing Application Scripts"
HREF="le63369-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x51.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>About This Guide</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le63369-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN117"
>3. Conventions Used in This Guide</A
></H1
><P
>These type conventions and symbols are used in this guide:</P
><P
></P
><DIV
CLASS="VARIABLELIST"
><DL
><DT
><B
CLASS="COMMAND"
>command</B
></DT
><DD
><P
>Function names, literal command-line arguments (options/flags)</P
></DD
><DT
><TT
CLASS="FILENAME"
>filename</TT
></DT
><DD
><P
>Name of a file or directory</P
></DD
><DT
><TT
CLASS="USERINPUT"
><B
>command -o option</B
></TT
></DT
><DD
><P
>Commands and text that you are to type literally in response to
shell and command prompts</P
></DD
><DT
><I
CLASS="FIRSTTERM"
>term</I
></DT
><DD
><P
>New terms</P
></DD
><DT
><I
CLASS="CITETITLE"
>Book Title</I
></DT
><DD
><P
>Manual or book title</P
></DD
><DT
><TT
CLASS="REPLACEABLE"
><I
>variable</I
></TT
></DT
><DD
><P
>Command-line arguments, filenames, and variables to be supplied
by the user in examples, code, and syntax statements</P
></DD
><DT
><TT
CLASS="LITERAL"
>literal text</TT
></DT
><DD
><P
>Code examples, error messages, prompts, and screen text</P
></DD
><DT
><TT
CLASS="LITERAL"
>#</TT
></DT
><DD
><P
>System shell prompt for the superuser (<TT
CLASS="LITERAL"
>root</TT
>)</P
></DD
></DL
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x51.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le63369-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Related Documentation</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le21374-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Introduction to Writing Application Scripts</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2321.html010064400016050000001000000101630717757015000140010ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>General Testing and Debugging Techniques</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Testing Scripts"
HREF="le96600-parent.html"><LINK
REL="PREVIOUS"
TITLE="Testing Scripts"
HREF="le96600-parent.html"><LINK
REL="NEXT"
TITLE="Debugging Notes"
HREF="z943900191lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le96600-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 5. Testing Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z943900191lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2321"
>5.1. General Testing and Debugging Techniques</A
></H1
><P
>Some general testing and debugging techniques you can use during testing are as follows: </P
><P
></P
><UL
><LI
><P
>To get debugging information, adding the following line to each of your scripts in the main function of the script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>set -x</PRE
></TD
></TR
></TABLE
></LI
><LI
><P
>To check that an application is running on a node, you may be able to use a command provided by the application.</P
></LI
><LI
><P
>Another way to check that an application is running on a node, is to enter this command on that node:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># <TT
CLASS="USERINPUT"
><B
>ps -ef | grep </B
></TT
> <TT
CLASS="REPLACEABLE"
><I
>application</I
></TT
> </PRE
></TD
></TR
></TABLE
><P
><TT
CLASS="REPLACEABLE"
><I
>application</I
></TT
> is the name (or a portion of the name) of the executable for the application.</P
></LI
><LI
><P
>To show the status of a resource, use the following <TT
CLASS="LITERAL"
>cluster_mgr</TT
> command:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>set cluster </B
></TT
><TT
CLASS="REPLACEABLE"
><I
>clustername</I
></TT
>
cmgr&#62; <TT
CLASS="USERINPUT"
><B
>show status of resource </B
></TT
><TT
CLASS="REPLACEABLE"
><I
>resourcename</I
></TT
><TT
CLASS="USERINPUT"
><B
> of resource_type </B
></TT
><TT
CLASS="REPLACEABLE"
><I
>typename</I
></TT
></PRE
></TD
></TR
></TABLE
></LI
><LI
><P
>To show the status of a node, use the following <TT
CLASS="LITERAL"
>cluster_mgr</TT
> command: </P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>show status of node </B
></TT
><TT
CLASS="REPLACEABLE"
><I
>nodename</I
></TT
></PRE
></TD
></TR
></TABLE
></LI
><LI
><P
>To show the status of a resource group, use the following <TT
CLASS="LITERAL"
>cluster_mgr</TT
> command:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>show status of resource_group </B
></TT
><TT
CLASS="REPLACEABLE"
><I
>rgname</I
></TT
><TT
CLASS="USERINPUT"
><B
>&#8194;in cluster </B
></TT
><TT
CLASS="REPLACEABLE"
><I
>cname</I
></TT
></PRE
></TD
></TR
></TABLE
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le96600-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z943900191lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Testing Scripts</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le96600-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Debugging Notes</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2401.html010064400016050000001000000165030717757015500140110ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Testing an Action Script</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Testing Scripts"
HREF="le96600-parent.html"><LINK
REL="PREVIOUS"
TITLE="Debugging Notes"
HREF="z943900191lhj.html"><LINK
REL="NEXT"
TITLE="Special Testing Considerations for the monitor Script"
HREF="x2482.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z943900191lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 5. Testing Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2482.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2401"
>5.3. Testing an Action Script</A
></H1
><P
> To test an action script, do the following:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>Create an input file, such as <TT
CLASS="LITERAL"
>/tmp/input</TT
>, that contains expected resource names. For example, to create a file that contains the resource named <TT
CLASS="LITERAL"
>disk1</TT
> do the following:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># <TT
CLASS="USERINPUT"
><B
>echo "/disk1" &#62; /tmp/input</B
></TT
></PRE
></TD
></TR
></TABLE
></LI
><LI
><P
>Create an input parameter file, such as <TT
CLASS="FILENAME"
>/tmp/ipparamfile</TT
>, as follows:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># <TT
CLASS="USERINPUT"
><B
>echo "ClusterName web-cluster" &#62; /tmp/ipparamfile</B
></TT
></PRE
></TD
></TR
></TABLE
></LI
><LI
><P
>Execute the action script as follows:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># <TT
CLASS="USERINPUT"
><B
>./start /tmp/input /tmp/output /tmp/ipparamfile</B
></TT
></PRE
></TD
></TR
></TABLE
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The use of the input parameter file is optional.</P
></BLOCKQUOTE
></DIV
></LI
><LI
><P
>Change the log level from <TT
CLASS="LITERAL"
>HA_NORMLVL</TT
> to <TT
CLASS="LITERAL"
>HA_DBGLVL</TT
> to allow messages written  with <TT
CLASS="LITERAL"
>HA_DBGLOG</TT
> to be printed by adding the following line after the <TT
CLASS="LITERAL"
>set_global_variables</TT
> statement in your script:<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>HA_CURRENT_LOGLEVEL=$HA_DBGLVL</PRE
></TD
></TR
></TABLE
></P
></LI
></OL
><P
>The output file will contain one of the following return values for the <TT
CLASS="LITERAL"
>start</TT
>, <TT
CLASS="LITERAL"
>stop</TT
>,  <TT
CLASS="LITERAL"
>monitor</TT
>, and <TT
CLASS="LITERAL"
>restart</TT
> scripts:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>HA_SUCCESS=0
HA_INVAL_ARGS=1
HA_CMD_FAILED=2
HA_NOTSUPPORTED=3
HA_NOCFGINFO=4</PRE
></TD
></TR
></TABLE
><P
>The output file will contain one of the following return values for the <TT
CLASS="LITERAL"
>exclusive</TT
> script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>HA_NOT_RUNNING=0
HA_RUNNING=2</PRE
></TD
></TR
></TABLE
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>If you call the <B
CLASS="COMMAND"
>exit_script</B
> function prior to normal termination, it should be preceded by the <B
CLASS="COMMAND"
>ha_write_status_for_resource</B
> function and you should use the same return code that is logged to the output file.</P
></BLOCKQUOTE
></DIV
><P
>Suppose you have a resource named <TT
CLASS="LITERAL"
>/disk1</TT
> and the following files:</P
><P
></P
><UL
><LI
><P
>The syntax for the input file is: <TT
CLASS="REPLACEABLE"
><I
>&#60;resourcename&#62;</I
></TT
></P
></LI
><LI
><P
>The syntax for the output file is: <TT
CLASS="REPLACEABLE"
><I
>&#60;resourcename&#62; &#60;status&#62;</I
></TT
></P
></LI
></UL
><P
>The following example shows:</P
><P
></P
><UL
><LI
><P
>The exit status of the action script is 1</P
></LI
><LI
><P
>The exit status of the resource is 2</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The use of <TT
CLASS="LITERAL"
>anonymous</TT
> indicates that the script was run manually. When the script is run by Linux FailSafe, the full path to the script name is displayed.</P
></BLOCKQUOTE
></DIV
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># <TT
CLASS="USERINPUT"
><B
>echo </B
></TT
>"<TT
CLASS="USERINPUT"
><B
>/disk1</B
></TT
>"<TT
CLASS="USERINPUT"
><B
>&#8194;&#62; /tmp/ipfile</B
></TT
>
# <TT
CLASS="USERINPUT"
><B
>./m</B
></TT
><TT
CLASS="USERINPUT"
><B
>onitor  /tmp/ipfile</B
></TT
><TT
CLASS="USERINPUT"
><B
>&#8194;/tmp/opfile /tmp/ipparamfile</B
></TT
>
# <TT
CLASS="USERINPUT"
><B
>echo $?</B
></TT
>
2
# <TT
CLASS="USERINPUT"
><B
>cat /tmp/opfile</B
></TT
>
/disk1 2
# <TT
CLASS="USERINPUT"
><B
>tail /var/log/failsafe/script_heb1</B
></TT
>
Tue Aug 25 11:32:57.437 &#60;anonymous script 23787:0 Unknown:0&#62; ./monitor:
./monitor called with /tmp/ipfile and /tmp/opfile
Tue Aug 25 11:32:58.118 &#60;anonymous script 24556:0 Unknown:0&#62; ./monitor:
check to see if /disk1 is mounted on /disk1
Tue Aug 25 11:32:58.433 &#60;anonymous script 23811:0 Unknown:0&#62; ./monitor:
/bin/mount | grep /disk1 | grep /disk1 &#62;&#62; /dev/null 2&#62;&#38;1 exited with
status 0
Tue Aug 25 11:32:58.665 &#60;anonymous script 24124:0 Unknown:0&#62; ./monitor:
stat mount point /disk1
Tue Aug 25 11:32:58.969 &#60;anonymous script 23525:0 Unknown:0&#62; ./monitor:
/bin/stat /disk1 exited with status 0
Tue Aug 25 11:32:59.258 &#60;anonymous script 24431:0 Unknown:0&#62; ./monitor:
check the filesystem /disk1 is exported
Tue Aug 25 11:32:59.610 &#60;anonymous script 6982:0 Unknown:0&#62; ./monitor:
Tue Aug 25 11:32:59.917 &#60;anonymous script 24040:0 Unknown:0&#62; ./monitor:
awk '{print \$1}' /var/run/failasafe/tmp/exportfs.23762 | grep /disk1 exited
with status 1
Tue Aug 25 11:33:00.131 &#60;anonymous script 24418:0 Unknown:0&#62; ./monitor:
echo failed to find /disk1 in exported filesystem list:-
Tue Aug 25 11:33:00.340 &#60;anonymous script 24236:0 Unknown:0&#62; ./monitor:
echo /disk2</PRE
></TD
></TR
></TABLE
></LI
></UL
><P
>For additional information about a script's processing, see the <TT
CLASS="FILENAME"
>/var/log/failsafe/script_<TT
CLASS="REPLACEABLE"
><I
>nodename</I
></TT
></TT
>.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z943900191lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2482.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Debugging Notes</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le96600-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Special Testing Considerations for the <TT
CLASS="LITERAL"
>monitor</TT
> Script</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>TING"
># <TT
CLASS="USERINPUT"
><B
>echo "ClusterName web-cluster" &#62; /tmp/ipparamfile</B
></TT
></PRE
></TD
></TR
></TABLE
></LI
><LI
><P
>Execute the action script as follows:</P
><TABhtml/x2482.html010064400016050000001000000060060717757015700140210ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Special Testing Considerations for the monitor Script</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Testing Scripts"
HREF="le96600-parent.html"><LINK
REL="PREVIOUS"
TITLE="Testing an Action Script"
HREF="x2401.html"><LINK
REL="NEXT"
TITLE="Starting the FailSafe Manager"
HREF="z943897815lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2401.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 5. Testing Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z943897815lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2482"
>5.4. Special Testing Considerations for the <TT
CLASS="LITERAL"
>monitor</TT
> Script</A
></H1
><P
> The <TT
CLASS="LITERAL"
>monitor</TT
> script tests the liveliness of applications and resources. The best way to test it is to induce a failure, run the script, and check if this failure is detected by the script; then repeat the process for another failure.</P
><P
>Use this checklist for testing a <TT
CLASS="LITERAL"
>monitor</TT
> script:</P
><P
></P
><UL
><LI
><P
>Verify that the script detects failure of the application successfully.</P
></LI
><LI
><P
>Verify that the script always exits with a return value.</P
></LI
><LI
><P
>Verify that the script does not contain commands that can hang (such as using DNS for name resolution) or those that continue forever, such as <TT
CLASS="LITERAL"
>ping</TT
>.</P
></LI
><LI
><P
>Verify that the script completes before the time-out value specified in the configuration file.</P
></LI
><LI
><P
>Verify that the script's return codes are correct.</P
></LI
></UL
><P
>During testing, measure the time it takes for a script to complete and adjust the monitoring times in your script accordingly. To get a good estimate of the time required for the script to execute, run it under different system load conditions.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2401.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z943897815lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Testing an Action Script</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le96600-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Starting the FailSafe Manager</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2568.html010064400016050000001000000074750717757017500140410ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Linux FailSafe application interfaces</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="NEXT"
TITLE="Set Global Definitions"
HREF="x2618.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z944252972lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2618.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2568"
>B.1. Linux FailSafe application interfaces</A
></H1
><P
>The Linux FailSafe application interface identifies resources by two
strings: <P
></P
><UL
><LI
><P
>Resource name</P
></LI
><LI
><P
>Resource type</P
></LI
></UL
></P
><P
>For example, a resource named <TT
CLASS="LITERAL"
>vol1</TT
> of resource type <TT
CLASS="LITERAL"
>volumes</TT
> is identified by the following: <TT
CLASS="LITERAL"
>vol1 volumes</TT
>.</P
><P
>Using the script library simplifies interaction with the interface.
If you do not use the script library, you must understand the following file
formats used by action scripts:</P
><P
></P
><UL
><LI
><P
>Input file, which contains the list of resources that must
be acted on by the executable; each resource must be specified on a separate
line in the file.  SRMD can also pass action flags for each resource in the
input file. The format of a line in the input file is as follows (fields separated
by white space): </P
><P
CLASS="LITERALLAYOUT"
><TT
CLASS="REPLACEABLE"
><I
>resource_name  action_flags</I
></TT
></P
></LI
><LI
><P
>Output file, in which the executable writes the return the
status of the each resource on a separate line using the following format
(fields separated by white space): </P
><P
CLASS="LITERALLAYOUT"
><TT
CLASS="REPLACEABLE"
><I
>resource_name resource_status</I
></TT
></P
></LI
><LI
><P
>(optional) Input parameters file, which contains the name
of the cluster:</P
><P
CLASS="LITERALLAYOUT"
>ClusterName&nbsp;<TT
CLASS="REPLACEABLE"
><I
>clustername</I
></TT
></P
></LI
></UL
><P
> The following codes are defined in  <TT
CLASS="LITERAL"
>/usr/lib/failsafe/common_scripts/scriptlib</TT
>: </P
><P
></P
><UL
><LI
><P
><TT
CLASS="LITERAL"
>HA_SUCCESS</TT
></P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>HA_NOT_RUNNING</TT
></P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>HA_INVAL_ARGS</TT
></P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>HA_CMD_FAILED</TT
></P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>HA_RUNNING</TT
></P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>HA_NOTSUPPORTED</TT
></P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>HA_NOCFGINFO</TT
></P
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2618.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Using the SRM Script Library</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Set Global Definitions</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>EL="PREVIOUS"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="NEXT"
TITLE="Set Global Definitions"
HREF="x2618.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="html/x2618.html010064400016050000001000000210040717757021500140100ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Set Global Definitions</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Linux FailSafe application interfaces"
HREF="x2568.html"><LINK
REL="NEXT"
TITLE="Check Arguments"
HREF="x2852.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2568.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2852.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2618"
>B.2. Set Global Definitions</A
></H1
><P
>The <B
CLASS="COMMAND"
>ha_set_global_defs()</B
> function sets the global
definitions for the environment variables shown in this section.  </P
><P
>The <TT
CLASS="LITERAL"
>HA_INFILE</TT
> and <TT
CLASS="LITERAL"
>HA_OUTFILE</TT
> variables
set the input and output files for a script. These variables do not have global
definitions, and are not set by the <B
CLASS="COMMAND"
>ha_set_global_defs()</B
>
function.</P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2630"
>B.2.1. Global Variable</A
></H2
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2632"
>B.2.1.1. <TT
CLASS="LITERAL"
>HA_HOSTNAME</TT
></A
></H3
><P
>The output of the <TT
CLASS="LITERAL"
>uname</TT
> command with the <B
CLASS="COMMAND"
>-n</B
> option, which is the host name or nodename. The nodename is the
name by which the system is known to communications networks. </P
><P
>Default: <TT
CLASS="FILENAME"
>`uname -n`</TT
></P
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2642"
>B.2.2. Command Location  Variables</A
></H2
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2644"
>B.2.2.1. <TT
CLASS="LITERAL"
>HA_CMDSPATH</TT
></A
></H3
><P
>Path to user commands.      </P
><P
>Default: <TT
CLASS="FILENAME"
>/usr/lib/failsafe/bin</TT
></P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2665"
>B.2.2.2. <TT
CLASS="LITERAL"
>HA_PRIVCMDSPATH</TT
></A
></H3
><P
>Path to privileged commands (those that can only be run by <TT
CLASS="LITERAL"
>root</TT
>).  </P
><P
>Default: <TT
CLASS="FILENAME"
>/usr/lib/sysadm/privbin</TT
></P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2678"
>B.2.2.3. <TT
CLASS="LITERAL"
>HA_LOGCMD</TT
></A
></H3
><P
>Command used to log information.</P
><P
>Default: <TT
CLASS="FILENAME"
>ha_cilog</TT
></P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2686"
>B.2.2.4. <TT
CLASS="LITERAL"
>HA_RESOURCEQUERYCMD</TT
></A
></H3
><P
>Resource query command. This is an internal command that is not meant
for direct use in scripts; use the <B
CLASS="COMMAND"
>ha_get_info()</B
> function
of <TT
CLASS="LITERAL"
>scriptlib</TT
> instead. </P
><P
>Default: <TT
CLASS="FILENAME"
>resourceQuery</TT
></P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2699"
>B.2.2.5. <TT
CLASS="LITERAL"
>HA_SCRIPTTMPDIR</TT
></A
></H3
><P
>Location of the script temporary directory.</P
><P
>Default: <TT
CLASS="FILENAME"
>/var/run/failsafe/tmp</TT
></P
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2707"
>B.2.3. Database Location  Variables</A
></H2
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2709"
>B.2.3.1. <TT
CLASS="LITERAL"
>HA_CDB</TT
></A
></H3
><P
>Location of the  cluster configuration database. </P
><P
>Default: <TT
CLASS="FILENAME"
>/var/lib/failsafe/cdb/cdb.db</TT
></P
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2719"
>B.2.4. Script Log Level Variables</A
></H2
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2721"
>B.2.4.1. <TT
CLASS="LITERAL"
>HA_NORMLVL</TT
></A
></H3
><P
>Normal level of script logs. </P
><P
>Default: 1</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2728"
>B.2.4.2. <TT
CLASS="LITERAL"
>HA_DBGLVL</TT
></A
></H3
><P
>Debug level of script logs.</P
><P
>Default: 10</P
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2735"
>B.2.5. Script Log Variables</A
></H2
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2737"
>B.2.5.1. <TT
CLASS="LITERAL"
>HA_SCRIPTGROUP</TT
></A
></H3
><P
>Log for the script group.  </P
><P
>Default: <TT
CLASS="FILENAME"
>ha_script</TT
></P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2747"
>B.2.5.2. <TT
CLASS="LITERAL"
>HA_SCRIPTSUBSYS</TT
></A
></H3
><P
>Log for the script subsystem. </P
><P
>Default:<TT
CLASS="FILENAME"
>script</TT
></P
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2757"
>B.2.6. Script Logging Command Variables</A
></H2
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2759"
>B.2.6.1. <TT
CLASS="LITERAL"
>HA_DBGLOG</TT
></A
></H3
><P
>Command used to log debug messages from the scripts. </P
><P
>Default: <TT
CLASS="LITERAL"
>ha_dbglog</TT
></P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2769"
>B.2.6.2. <TT
CLASS="LITERAL"
>HA_CURRENT_LOGLEVEL</TT
></A
></H3
><P
>The value of the current logging level. <TT
CLASS="LITERAL"
>ha_log</TT
> will
only output messages if this value is greater than or equal to <TT
CLASS="LITERAL"
>HA_NORMLVL</TT
>.    <TT
CLASS="LITERAL"
>ha_dbglog</TT
> will only output messages if this
value is greater than or equal to <TT
CLASS="LITERAL"
>HA_DBGLVL</TT
>.</P
><P
>Default: 2</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2780"
>B.2.6.3. <TT
CLASS="LITERAL"
>HA_LOG</TT
></A
></H3
><P
></P
><P
>Command used to log the scripts.</P
><P
>Default: <TT
CLASS="LITERAL"
>ha_log</TT
></P
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2789"
>B.2.7. Script Error Value Variables</A
></H2
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2791"
>B.2.7.1. <TT
CLASS="LITERAL"
>HA_SUCCESS</TT
></A
></H3
><P
>Successful execution of the script. This variable is used by the <TT
CLASS="LITERAL"
>start</TT
>, <TT
CLASS="LITERAL"
>stop</TT
>, <TT
CLASS="LITERAL"
>restart</TT
>, and <TT
CLASS="LITERAL"
>monitor</TT
> scripts. </P
><P
>Default: 0</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2802"
>B.2.7.2. <TT
CLASS="LITERAL"
>HA_NOT_RUNNING</TT
></A
></H3
><P
>The script is not running. This variable is used by <TT
CLASS="LITERAL"
>exclusive</TT
> scripts.</P
><P
>Default: 0</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2810"
>B.2.7.3. <TT
CLASS="LITERAL"
>HA_INVAL_ARGS</TT
></A
></H3
><P
></P
><P
>An invalid argument was entered. This is used by all scripts.</P
><P
>Default: 1</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2818"
>B.2.7.4. <TT
CLASS="LITERAL"
>HA_CMD_FAILED</TT
></A
></H3
><P
>A command called by the script has failed. his variable is used by the <TT
CLASS="LITERAL"
>start</TT
>, <TT
CLASS="LITERAL"
>stop</TT
>, <TT
CLASS="LITERAL"
>restart</TT
>, and <TT
CLASS="LITERAL"
>monitor</TT
>, scripts.</P
><P
>Default: 2</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2829"
>B.2.7.5. <TT
CLASS="LITERAL"
>HA_RUNNING</TT
></A
></H3
><P
>The script is running. This variable is used by <TT
CLASS="LITERAL"
>exclusive</TT
>
scripts. </P
><P
>Default: 2</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2837"
>B.2.7.6. <TT
CLASS="LITERAL"
>HA_NOTSUPPORTED</TT
></A
></H3
><P
></P
><P
>The specific action is not supported for this resource type. This is
used by all scripts. </P
><P
>Default: 3</P
></DIV
><DIV
CLASS="SECT3"
><H3
CLASS="SECT3"
><A
NAME="AEN2845"
>B.2.7.7. <TT
CLASS="LITERAL"
>HA_NOCFGINFO</TT
></A
></H3
><P
>No configuration information was found. This is used by all scripts.</P
><P
>Default: 4</P
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2568.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2852.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Linux FailSafe application interfaces</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Check Arguments</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2852.html010064400016050000001000000070170717757022000140140ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Check Arguments</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Set Global Definitions"
HREF="x2618.html"><LINK
REL="NEXT"
TITLE="Read an Input File"
HREF="x2876.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2618.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2876.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2852"
>B.3. Check Arguments</A
></H1
><P
>An action script has the following arguments: an input file, <TT
CLASS="LITERAL"
>HA_INFILE</TT
>, an output file <TT
CLASS="LITERAL"
>HA_OUTFILE</TT
>, and an
optional parameter file <TT
CLASS="LITERAL"
>HA_PARAMFILE</TT
>.  These become the
positional arguments to the script, <TT
CLASS="LITERAL"
>$1</TT
>, <TT
CLASS="LITERAL"
>$2</TT
>
and <TT
CLASS="LITERAL"
>$3</TT
> parameter file is optional.  </P
><P
>The  <TT
CLASS="LITERAL"
>ha_check_args()</TT
>
function checks the arguments specified for a script and sets the <TT
CLASS="LITERAL"
>$HA_INFILE</TT
> and <TT
CLASS="LITERAL"
>$HA_OUTFILE</TT
> variables accordingly. </P
><P
>If a parameter file exists, the <TT
CLASS="LITERAL"
>ha_check_args()</TT
> function
reads the list of parameters from the file and sets the <TT
CLASS="LITERAL"
>$HA_CLUSTERNAME</TT
> variable. </P
><P
>In the following, long lines use the continuation character (<TT
CLASS="LITERAL"
>\</TT
>) for readability.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_check_args()
{
    ${HA_DBGLOG} "$HA_SCRIPTNAME called with $1, $2 and $3"

    if  ! [ $# -eq 2 -o $# -eq 3 ]; then
        ${HA_LOG} "Incorrect number of arguments"
        return 1;
    fi

    if [ ! -r $1 ]; then
        ${HA_LOG} "file $1 is not readable or does not exist"
        return 1;
    fi

    if [ ! -s $1 ]; then
        ${HA_LOG} "file $1 is empty"
        return 1;
    fi

    if [ $# -eq 3 ]; then
        HA_PARAMFILE=$3

        if [ ! -r $3 ]; then
            ${HA_LOG} "file $3 is not readable or does not exist"
            return 1;
        fi

        HA_CLUSTERNAME=`/usr/bin/awk '{ if ( $1 == "ClusterName" ) \ 
            print $2 }' ${HA_PARAMFILE}`
    fi

    HA_INFILE=$1
    HA_OUTFILE=$2

    return 0;
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2618.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2876.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Set Global Definitions</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Read an Input File</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2876.html010064400016050000001000000043340717757022200140230ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Read an Input File</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Check Arguments"
HREF="x2852.html"><LINK
REL="NEXT"
TITLE="Execute a Command"
HREF="x2890.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2852.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2890.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2876"
>B.4. Read an Input File</A
></H1
><P
> The <B
CLASS="COMMAND"
>ha_read_infile()</B
>
function reads the <TT
CLASS="FILENAME"
>$HA_INFILE</TT
> input file into the <TT
CLASS="LITERAL"
>$HA_RES_NAMES</TT
> variable, which specifies the list of resource names.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_read_infile()
{
    HA_RES_NAMES="";

    for HA_RESOURCE in `cat ${HA_INFILE}`
    do
        HA_RES_NAMES="${HA_RES_NAMES} ${HA_RESOURCE}";
    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2852.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2890.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Check Arguments</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Execute a Command</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2890.html010064400016050000001000000062100717757022500140150ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Execute a Command</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Read an Input File"
HREF="x2876.html"><LINK
REL="NEXT"
TITLE="Write Status for a Resource"
HREF="x2912.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2876.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2912.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2890"
>B.5. Execute a Command</A
></H1
><P
> The <TT
CLASS="LITERAL"
>ha_execute_cmd()</TT
> function executes the command specified by  <TT
CLASS="LITERAL"
>$HA_CMD</TT
>,
which is set in the action script.  <TT
CLASS="LITERAL"
>$1</TT
> is the string to
be logged. The function returns 1 on error and 0 on success. On errors, the
standard output and standard error of the command is redirected to the log
file.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_execute_cmd()
{
    OUTFILE=${HA_SCRIPTTMPDIR}/script.$$

    ${HA_DBGLOG} $1

    eval ${HA_CMD} &#62; ${OUTFILE} 2&#62;&#38;1;

    ha_exit_code=$?;

    if [ $ha_exit_code -ne 0 ]; then
        ${HA_LOG} "$1 failed"
        ${HA_LOG} `cat ${HA_SCRIPTTMPDIR}/script.$$`
    fi

    ${HA_DBGLOG} "${HA_CMD} exited with status $ha_exit_code";

    rm ${OUTFILE}

    return $ha_exit_code;
}</PRE
></TD
></TR
></TABLE
><P
>The <TT
CLASS="LITERAL"
>ha_execute_cmd_ret()</TT
> function is similar to <TT
CLASS="LITERAL"
>ha_execute_cmd</TT
>, except
that it places the command output in the string <TT
CLASS="LITERAL"
>$HA_CMD_OUTPUT</TT
>.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_execute_cmd_ret()
{
    ${HA_DBGLOG} $1

    HA_CMD_OUTPUT=`${HA_CMD}`;

    ha_exit_code=$?;

    ${HA_DBGLOG} "${HA_CMD} exited with status $ha_exit_code";

    return $ha_exit_code;
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2876.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2912.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Read an Input File</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Write Status for a Resource</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>ERAL"
>ha_execute_cmd()</TT
> function executes the command specified by  <TT
CLASS="LITERAL"
>$HA_CMD</TT
>,
which is set in the action script.  <TT
CLASS="LITERAL"
>$1</TT
> is the string to
be logged. The function returns 1 on error and 0 on success. On errors, the
standard output and standard error of the command is redirected to the log
file.</P
><TABLE
BORDER="0"
BGCOhtml/x2912.html010064400016050000001000000052500717757023000140070ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Write Status for a Resource</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Execute a Command"
HREF="x2890.html"><LINK
REL="NEXT"
TITLE="Get the Value for a Field"
HREF="x2932.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2890.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2932.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2912"
>B.6. Write Status for a Resource</A
></H1
><P
>The <B
CLASS="COMMAND"
>ha_write_status_for_resource()</B
> function writes the status for a resource to the <TT
CLASS="LITERAL"
>$HA_OUTFILE</TT
> output file. <TT
CLASS="LITERAL"
>$1</TT
> is the resource name, and <TT
CLASS="LITERAL"
>$2</TT
> is the resource status.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_write_status_for_resource()
{
    echo $1 $2 &#62;&#62; $HA_OUTFILE;
}</PRE
></TD
></TR
></TABLE
><P
>Similarly, the <B
CLASS="COMMAND"
>ha_write_status_for_all_resources()</B
> function writes the status for all resources. <TT
CLASS="LITERAL"
>$HA_RES_NAMES</TT
> is the list of resource names.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_write_status_for_all_resources()
{
    for HA_RES in $HA_RES_NAMES
    do
        echo $HA_RES $1 &#62;&#62; $HA_OUTFILE;
    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2890.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2932.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Execute a Command</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Get the Value for a Field</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2932.html010064400016050000001000000053710717757023200140170ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Get the Value for a Field</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Write Status for a Resource"
HREF="x2912.html"><LINK
REL="NEXT"
TITLE="Get the Value for Multiple Fields"
HREF="x2946.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2912.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2946.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2932"
>B.7. Get the Value for a Field</A
></H1
><P
> The <TT
CLASS="LITERAL"
>ha_get_field()</TT
>
function obtains the field value from a string, where <TT
CLASS="LITERAL"
>$1</TT
>
is the string and <TT
CLASS="LITERAL"
>$2</TT
> is the field name. The string format
is a series of name-value field pairs, where a name field is followed by the
value of the name, separated by whitespace.  This appears as follows:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_get_field()
 {
     HA_STR=$1
     HA_FIELD_NAME=$2
     ha_found=0;
     ha_field=1;
 
     for ha_i in $HA_STR
     do
         if [ $ha_field -eq 1 ]; then
             ha_field=0;
             if [ $ha_i = $HA_FIELD_NAME ]; then
                 ha_found=1;
             fi
         else
             ha_field=1;
             if [ $ha_found -eq 1 ]; then
                 HA_FIELD_VALUE=$ha_i
                 return 0;
             fi
         fi
     done
 
     return 1;
 }</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2912.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2946.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Write Status for a Resource</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Get the Value for Multiple Fields</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2946.html010064400016050000001000000063160717757023500140270ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Get the Value for Multiple Fields</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Get the Value for a Field"
HREF="x2932.html"><LINK
REL="NEXT"
TITLE="Get Resource Information"
HREF="x2955.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2932.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2955.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2946"
>B.8. Get the Value for Multiple Fields</A
></H1
><P
>The <TT
CLASS="LITERAL"
>ha_get_multi_fields()</TT
> function obtains the field
values from  a string, where <TT
CLASS="LITERAL"
>$1</TT
> is the string and <TT
CLASS="LITERAL"
>$2</TT
> is the field name. The string format is a series of name-value
field pairs, where a name field is followed by the value of the name, separated
by whitespace. </P
><P
>This function is typically used to extract dependency information. 
There may be multiple fields with the same name so the string returned in <TT
CLASS="LITERAL"
>HA_FIELD_VALUE</TT
> may contain multiple values separated by white space.
 This appears as follows: <TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_get_multi_fields()
{
    HA_STR=$1
    HA_FIELD_NAME=$2
    ha_found=0;
    ha_field=1;
 
    for ha_i in $HA_STR
    do
        if [ $ha_field -eq 1 ]; then
            ha_field=0;
            if [ $ha_i = $HA_FIELD_NAME ]; then
                ha_found=1;
            fi
        else
            ha_field=1;
            if [ $ha_found -eq 1 ]; then
                if [ -z "$HA_FIELD_VALUE" ]; then
                    HA_FIELD_VALUE=$ha_i;
                else
                    HA_FIELD_VALUE="$HA_FIELD_VALUE $ha_i";
                fi;
                ha_found=0;
            fi
        fi
    done
 
    if [ -z "$HA_FIELD_VALUE" ]; then
        return 1;
    else
        return 0;
    fi
}</PRE
></TD
></TR
></TABLE
></P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2932.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2955.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Get the Value for a Field</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Get Resource Information</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2955.html010064400016050000001000000137020717757023700140260ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Get Resource Information</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Get the Value for Multiple Fields"
HREF="x2946.html"><LINK
REL="NEXT"
TITLE="Print Exclusivity Check Messages"
HREF="x2982.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2946.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2982.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2955"
>B.9. Get Resource Information</A
></H1
><P
>The <TT
CLASS="LITERAL"
>ha_get_info()</TT
> and <TT
CLASS="LITERAL"
>ha_get_info_debug()</TT
>functions
read resource information. <TT
CLASS="LITERAL"
>$1</TT
> is the resource type and <TT
CLASS="LITERAL"
>$2</TT
> is the resource name, and <TT
CLASS="LITERAL"
>$3</TT
> is an optional
parameter of any value that specifies a request for resource dependency information
. Resource information is stored in the <TT
CLASS="LITERAL"
>HA_STRING</TT
> variable.
The return value of the query is passed back to the caller, 0 indicates success.
 All errors are logged.  If the <TT
CLASS="LITERAL"
>resourceQuery</TT
> command fails,
the <TT
CLASS="LITERAL"
>HA_STRING</TT
> is set to an invalid string, and future calls
to <TT
CLASS="LITERAL"
>ha_get_info()</TT
> or  <TT
CLASS="LITERAL"
>ha_get_info_debug()</TT
>
return errors.</P
><P
>The function <TT
CLASS="LITERAL"
>ha_get_info_debug()</TT
> differs from <TT
CLASS="LITERAL"
>ha_get_info</TT
> in that it will  attempt the resource query a single
time, instead of retrying as <TT
CLASS="LITERAL"
>ha_get_info()</TT
> would do. This
is likely to be useful for testing due to faster returns and less complexity.
 You can call this function directly, or you can create the file <TT
CLASS="FILENAME"
>/var/run/failsafe/resourceQuery.debug</TT
> which will cause all invocations
of <TT
CLASS="LITERAL"
>ha_get_info()</TT
> in all scripts on the node to be diverted
to  <TT
CLASS="LITERAL"
>ha_get_info_debug()</TT
> until the file is removed.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_get_info()
{
    if [ -f /var/run/failsafe/resourceQuery.debug ]; then
        ha_get_info_debug $1 $2 $3
        return;
    fi

    if [ -n "$3" ]; then
        ha_doall="_ALL=true"
    else
        ha_doall=""
    fi

    # Retry resourceQuery command $HA_RETRY_CMD_MAX times if $HA_RETRY_CMD_ERR
    # is returned.
    ha_retry_count=1

    while [ $ha_retry_count -le $HA_RETRY_CMD_MAX ];
    do
        if [ -n "${HA_CLUSTERNAME}" ]; then
            HA_STRING=`${HA_PRIVCMDSPATH}/${HA_RESOURCEQUERYCMD} \
                        _CDB_DB=$HA_CDB _RESOURCE=$2 _RESOURCE_TYPE=$1  \
                        $ha_doall _NO_LOGGING=true _CLUSTER=${HA_CLUSTERNAME}`
        else
            HA_STRING=`${HA_PRIVCMDSPATH}/${HA_RESOURCEQUERYCMD} \
                        _CDB_DB=$HA_CDB _RESOURCE=$2 _RESOURCE_TYPE=$1  \
                        $ha_doall _NO_LOGGING=true`
        fi

        ha_exit_code=$?

        if [ $ha_exit_code -ne 0 ]; then
            ${HA_LOG} "${HA_RESOURCEQUERYCMD}: resource name $2 resource type $1"
            ${HA_LOG} "Failed with error: ${HA_STRING}";
        fi

        if [ $ha_exit_code -ne $HA_RETRY_CMD_ERR ]; then
            break;
        fi

        ha_retry_count=`expr $ha_retry_count + 1`

    done

   if [ -n "$ha_doall" ]; then
        echo $HA_STRING  \
                | grep "No resource dependencies" &#62; /dev/null 2&#62;&#38;1
        if [ $? -eq 0 ]; then
            HA_STRING=
        else
            HA_STRING=`echo $HA_STRING  | /bin/sed -e "s/^.*Resource dependencies
//"`
        fi
    fi

    return ${ha_exit_code};
}


ha_get_info_debug()
{
    if [ -n "$3" ]; then
        ha_doall="_ALL=true"
    else
        ha_doall=""
    fi

    if [ -n "${HA_CLUSTERNAME}" ]; then
        HA_STRING=`${HA_PRIVCMDSPATH}/${HA_RESOURCEQUERYCMD} \
                    _CDB_DB=$HA_CDB _RESOURCE=$2 _RESOURCE_TYPE=$1      \
                    $ha_doall _CLUSTER=${HA_CLUSTERNAME}`
    else
        HA_STRING=`${HA_PRIVCMDSPATH}/${HA_RESOURCEQUERYCMD} \
                    _CDB_DB=$HA_CDB _RESOURCE=$2 _RESOURCE_TYPE=$1 $ha_doall`
    fi
    ha_exit_code=$?

    if [ $? -ne 0 ]; then
        ${HA_LOG} "${HA_RESOURCEQUERYCMD}: resource name $2 resource type $1"
        ${HA_LOG} "Failed with error: ${HA_STRING}";
    fi

    if [ -n "$ha_doall" ]; then
        echo $HA_STRING  \
                | grep "No resource dependencies" &#62; /dev/null 2&#62;&#38;1
        if [ $? -eq 0 ]; then
            HA_STRING=
        else
            HA_STRING=`echo $HA_STRING  | /bin/sed -e "s/^.*Resource dependencies
//"`
        fi
    fi

    return ${ha_exit_code};
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2946.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2982.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Get the Value for Multiple Fields</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Print Exclusivity Check Messages</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x2982.html010064400016050000001000000054270717757024200140270ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Print Exclusivity Check Messages</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"><LINK
REL="PREVIOUS"
TITLE="Get Resource Information"
HREF="x2955.html"><LINK
REL="NEXT"
TITLE="Glossary"
HREF="g3001.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2955.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix B. Using the SRM Script Library</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="g3001.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN2982"
>B.10. Print Exclusivity Check Messages</A
></H1
><P
>The <B
CLASS="COMMAND"
>ha_print_exclusive_status()</B
> function prints exclusivity check messages to the log file. <TT
CLASS="LITERAL"
>$1</TT
> is the resource name and <TT
CLASS="LITERAL"
>$2</TT
> is the exit status.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_print_exclusive_status()
{
    if [ $? -eq $HA_NOT_RUNNING ]; then
        ${HA_LOG} "resource $1 exclusive status: NOT RUNNING"
    else
        ${HA_LOG} "resource $1 exclusive status: RUNNING"
    fi
}</PRE
></TD
></TR
></TABLE
><P
>The <B
CLASS="COMMAND"
>ha_print_exclusive_status_all_resources()</B
> function is similar, but it prints exclusivity check messages for
all resources. <TT
CLASS="LITERAL"
>$HA_RES_NAMES</TT
> is the list of resource names.</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_print_exclusive_status_all_resources()
{
    for HA_RES in $HA_RES_NAMES
    do
        ha_print_exclusive_status ${HA_RES} $1
    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2955.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="g3001.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Get Resource Information</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Glossary</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x47.html010064400016050000001000000042040717756772500136610ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Audience</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="About This Guide"
HREF="le21374-parent.html"><LINK
REL="PREVIOUS"
TITLE="About This Guide"
HREF="le21374-parent.html"><LINK
REL="NEXT"
TITLE="Related Documentation"
HREF="x51.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le21374-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>About This Guide</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x51.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN47"
>1. Audience</A
></H1
><P
>This guide is written for system programmers who are developing
scripts for the Linux FailSafe system. These scripts allow the failover
of applications that are not handled by the base and optional products.
Readers must be familiar with the operation and administration of nodes
running Linux FailSafe, with the applications that are to be failed over,
and with the <I
CLASS="CITETITLE"
>Linux FailSafe Administrator's Guide</I
>.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le21374-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x51.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>About This Guide</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le21374-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Related Documentation</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/x51.html010064400016050000001000000057150717756772700136660ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Related Documentation</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="About This Guide"
HREF="le21374-parent.html"><LINK
REL="PREVIOUS"
TITLE="Audience"
HREF="x47.html"><LINK
REL="NEXT"
TITLE="Conventions Used in This Guide"
HREF="x117.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x47.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>About This Guide</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x117.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN51"
>2. Related Documentation</A
></H1
><P
>Besides this guide, other documentation for Linux FailSafe includes
the following:</P
><P
></P
><UL
><LI
><P
><I
CLASS="CITETITLE"
>Linux FailSafe Administrator's Guide</I
></P
></LI
></UL
><P
>System man pages for referenced commands are as follows:</P
><P
></P
><UL
><LI
><P
><B
CLASS="COMMAND"
>cbeutil</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>cdbBackup</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>cdbRestore</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>cdbutil</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>cluster_mgr</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>crsd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>failsafe</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>cdbd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_cilog</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_cmsd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_exec2</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_fsd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_gcd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_ifd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_ifdadmin</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_macconfig2</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_srmd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_statd2</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>haStatus</B
></P
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x47.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x117.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Audience</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le21374-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Conventions Used in This Guide</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z942786554lhj.html010064400016050000001000000075650717757002200151450ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Set of Action Scripts</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="PREVIOUS"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="NEXT"
TITLE="Understanding the Execution of Action Scripts"
HREF="z942787505lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le77672-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z942787505lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z942786554LHJ"
>2.1. Set of Action Scripts</A
></H1
><DIV
CLASS="CAUTION"
><P
></P
><TABLE
CLASS="CAUTION"
BORDER="1"
WIDTH="100%"
><TR
><TD
ALIGN="CENTER"
><B
>Caution</B
></TD
></TR
><TR
><TD
ALIGN="LEFT"
><P
>Multiple instances of scripts may be executed at the same time. For
more information, see <A
HREF="z942787505lhj.html"
>Section 2.2</A
>.</P
></TD
></TR
></TABLE
></DIV
><P
>The following set of action scripts can be provided for each resource:</P
><P
></P
><UL
><LI
><P
><TT
CLASS="LITERAL"
>exclusive</TT
>, which verifies that the resource
is not already running</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>start</TT
>, which starts the resource</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>stop</TT
>, which stops the resource</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>monitor</TT
>, which monitors the resource</P
></LI
><LI
><P
><TT
CLASS="LITERAL"
>restart</TT
>, which restarts the resource on
the same node when a monitoring failure occurs</P
></LI
></UL
><P
>The <TT
CLASS="LITERAL"
>start</TT
>, <TT
CLASS="LITERAL"
>stop</TT
>, and <TT
CLASS="LITERAL"
>exclusive</TT
> scripts are required for every resource type.</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The <TT
CLASS="LITERAL"
>start</TT
> and <TT
CLASS="LITERAL"
>stop</TT
> scripts must
be <I
CLASS="FIRSTTERM"
>idempotent</I
>; that is, an action requested multiple
times successively should continue to return success, and should have no side-effects.
 For example, if the <TT
CLASS="LITERAL"
>start</TT
> script is run for a resource
that is already started, the script must not return an error.</P
></BLOCKQUOTE
></DIV
><P
>A <TT
CLASS="LITERAL"
>monitor</TT
> script is required, but if you wish it
may contain only a return-success function. A <TT
CLASS="LITERAL"
>restart</TT
> script
is required if the application must have a restart ability on the same node
in case of failure. However, the <TT
CLASS="LITERAL"
>restart</TT
> script may contain
only a return-success function.   </P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z942787505lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Understanding the Execution of Action Scripts</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z942786569lhj.html010064400016050000001000000237530717757004400151540ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Preparation</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="PREVIOUS"
TITLE="Understanding the Execution of Action Scripts"
HREF="z942787505lhj.html"><LINK
REL="NEXT"
TITLE="Script Format"
HREF="z942786582lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z942787505lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z942786582lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z942786569LHJ"
>2.3. Preparation</A
></H1
><P
>Before you can write the action scripts, you must do the following:</P
><P
></P
><UL
><LI
><P
>Understand the <TT
CLASS="LITERAL"
>scriptlib</TT
> functions described
in <A
HREF="z944252972lhj.html"
>Appendix B</A
>.</P
></LI
><LI
><P
>Familiarize yourself with the script templates provided in
the following directory:  <TT
CLASS="FILENAME"
>/usr/lib/failsafe/resource_types/template</TT
>  </P
></LI
><LI
><P
>Read the man pages for the following commands:<P
></P
><UL
><LI
><P
><B
CLASS="COMMAND"
>cluster_mgr</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>cdbd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_cilog</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_cmsd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_exec2</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_fsd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_gcd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_ifd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_ifdadmin</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_macconfig2</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_srmd</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>ha_statd2</B
></P
></LI
><LI
><P
><B
CLASS="COMMAND"
>haStatus</B
></P
></LI
></UL
></P
></LI
><LI
><P
>Familiarize yourself with the action scripts for other highly
available services in <TT
CLASS="FILENAME"
>/usr/lib/failsafe/resource_types</TT
>
that are similar to the scripts you wish to create.</P
></LI
><LI
><P
>Understand how to do the following actions for your application:</P
><P
></P
><UL
><LI
><P
>Verify that the resource is running</P
></LI
><LI
><P
>Verify that the resource can be run</P
></LI
><LI
><P
>Start the resource</P
></LI
><LI
><P
>Stop the resource</P
></LI
><LI
><P
>Check for the server processes</P
></LI
><LI
><P
>Do a simple query as a client and understand the expected
response</P
></LI
><LI
><P
>Check for configuration file or directory existence (as needed)</P
></LI
></UL
></LI
><LI
><P
>Determine whether or not monitoring is required (see <A
HREF="z942786569lhj.html#LE54960-PARENT"
>Section 2.3.1</A
>). However, even if monitoring is not needed, a <TT
CLASS="LITERAL"
>monitor</TT
> script is still required; in this case, it can contain only
a return-success function.</P
></LI
><LI
><P
>Determine if a resource type must be added to the cluster
configuration database.</P
></LI
><LI
><P
>Understand the vendor-supplied startup and shutdown procedures.</P
></LI
><LI
><P
>Determine the configuration parameters for the application;
these may be used in the action script and should be stored in the CDB. </P
></LI
><LI
><P
>Determine whether the resource type can be restarted in its
local node, and whether this action makes sense.</P
></LI
></UL
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="LE54960-PARENT"
>2.3.1. Is Monitoring Necessary?</A
></H2
><P
>In the following situations, you may not
need to perform application monitoring: </P
><P
></P
><UL
><LI
><P
>Heartbeat monitoring is sufficient; that is, simply verifying
that the node is alive (provided automatically by the base software) determines
the health of the highly available service.</P
></LI
><LI
><P
>There is no process or resource that can be monitored. For
example, the Linux kernel ipchains filtering software performs IP filtering
on firewall nodes. Because the filtering is done in the kernel, there is no
process or resource to monitor.</P
></LI
><LI
><P
>A resource on which the application depends is already monitored.
For example, monitoring some client-node resources might best be done by monitoring
the file systems, volumes, and network interfaces they use. Because this is
already done by the base software, additional monitoring is not required.</P
><DIV
CLASS="CAUTION"
><P
></P
><TABLE
CLASS="CAUTION"
BORDER="1"
WIDTH="90%"
><TR
><TD
ALIGN="CENTER"
><B
>Caution</B
></TD
></TR
><TR
><TD
ALIGN="LEFT"
><P
>Beware that monitoring should be as lightweight as possible so that
it does not affect system performance. Also, security issues may make monitoring
difficult. If you are unable to provide a monitoring script with appropriate
performance and security, consider a monitoring agent; see <A
HREF="z942786646lhj.html"
>Section 2.7</A
>. </P
><P
></P
></TD
></TR
></TABLE
></DIV
></LI
></UL
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1031"
>2.3.2. Types of Monitoring</A
></H2
><P
>There are two types of monitoring that may be accomplished in a <TT
CLASS="LITERAL"
>monitor</TT
> script:</P
><P
></P
><UL
><LI
><P
>Is the resource present?</P
></LI
><LI
><P
>Is the resource responding?</P
></LI
></UL
><P
>You can define multiple levels of monitoring within the monitor script,
and the administrator can choose the desired level by configuring the resource
definition in the cluster configuration database. Ensure that the monitoring
level chosen does not affect system performance. For more information, see
the <I
CLASS="CITETITLE"
>Linux FailSafe Administrator's Guide</I
>.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1046"
>2.3.3. What are the Symptoms of Monitoring Failure?</A
></H2
><P
>Possible symptoms of failure include the following:</P
><P
></P
><UL
><LI
><P
>The resource returns an error code</P
></LI
><LI
><P
>The resource returns the wrong result</P
></LI
><LI
><P
>The resource does not return quickly enough</P
></LI
></UL
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1059"
>2.3.4. How Often Should Monitoring Occur?</A
></H2
><P
>You must determine the monitoring interval and time-out values for the <TT
CLASS="LITERAL"
> monitor</TT
> script. The time-out must be long enough to guarantee that
occasional anomalies do not cause false failovers. It will be useful for you
to determine the peak load that resource may need to sustain.   </P
><P
>You must also determine if the <TT
CLASS="LITERAL"
>monitor</TT
> test should
execute multiple times so that an application is not declared dead after a
single failure. In general, testing more than once before declaring failure
is a good idea.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1072"
>2.3.5. Examples of Testing for Monitoring Failure</A
></H2
><P
> The test should be simple and should complete quickly,
whether it succeeds or fails. Some examples of tests are as follows: </P
><P
></P
><UL
><LI
><P
>For a client/server applications that follows a well-defined
protocol, the <TT
CLASS="LITERAL"
>monitor</TT
> script can make a simple request
and verify that the proper response is received. </P
></LI
><LI
><P
>For a web server application, the <TT
CLASS="LITERAL"
>monitor</TT
>
script can request a home page, verify that the connection was made, and ignore
the resulting home page.</P
></LI
><LI
><P
>For a database, a simple request such as querying a table
can be made.</P
></LI
><LI
><P
>For NFS, more complicated end-to-end monitoring is required.
The test might consist of mounting an exported file system, checking access
to the file system with a <TT
CLASS="LITERAL"
>stat()</TT
> system call to the root
of the file system, and undoing the mount.</P
></LI
><LI
><P
>For a resource that writes to a log file, check that the size
of the log file is increasing or use the <B
CLASS="COMMAND"
>grep</B
> command to
check for a particular message.</P
></LI
><LI
><P
>The following command can be used to determine quickly whether
a process exists:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>/usr/bin/killall -0 <TT
CLASS="FILENAME"
>process_name</TT
></PRE
></TD
></TR
></TABLE
><P
>You can also use the <B
CLASS="COMMAND"
>ha_exec2</B
> command to check if
a process is running.</P
><P
>The <TT
CLASS="LITERAL"
>ha_exec2</TT
> command differs from <B
CLASS="COMMAND"
>killall</B
> in that it performs a more exhaustive check on the process name
as well as process arguments. <TT
CLASS="LITERAL"
>killall</TT
> searches for the
process using the process name only. The command line is as follows:</P
><P
CLASS="LITERALLAYOUT"
>/usr/lib/failsafe/bin/ha_exec2&nbsp;-s&nbsp;0&nbsp;-t&nbsp;<TT
CLASS="REPLACEABLE"
><I
>process_name</I
></TT
></P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>Do not use the <TT
CLASS="LITERAL"
>ps</TT
> command to check on a particular
process because its execution can be too slow.</P
></BLOCKQUOTE
></DIV
></LI
></UL
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z942787505lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z942786582lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Understanding the Execution of Action Scripts</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Script Format</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>orm application monithtml/z942786582lhj.html010064400016050000001000000266230717757005400151470ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Script Format</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="PREVIOUS"
TITLE="Preparation"
HREF="z942786569lhj.html"><LINK
REL="NEXT"
TITLE="Steps in Writing a Script"
HREF="z942786601lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z942786569lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z942786601lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z942786582LHJ"
>2.4. Script Format</A
></H1
><P
>Templates for the action scripts are provided in the following directory: </P
><P
CLASS="LITERALLAYOUT"
><TT
CLASS="FILENAME"
>/usr/lib/failsafe/resource_types/template</TT
></P
><P
>The template scripts have the same general format.  Following is the
order in which the information appears in the script:</P
><P
></P
><UL
><LI
><P
>Header information</P
></LI
><LI
><P
>Set local variables</P
></LI
><LI
><P
>Read resource information</P
></LI
><LI
><P
>Exit status</P
></LI
><LI
><P
>Perform the basic action of the script, which is the customized
area you must provide</P
></LI
><LI
><P
>Set global variables</P
></LI
><LI
><P
>Verify arguments</P
></LI
><LI
><P
>Read input file </P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>Action &#8220;scripts&#8221; can be of any form -- such as Bourne shell
script, perl script, or Clanguage program.</P
></BLOCKQUOTE
></DIV
></LI
></UL
><P
>The following sections show an example from the NFS <TT
CLASS="LITERAL"
>start</TT
>
script. Note that the contents of these examples may not match the latest
software.</P
><P
></P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1147"
>2.4.1. Header Information</A
></H2
><P
>The header information contains comments about the resource type, script
type, and resource configuration format. You must modify the code as needed.</P
><P
>Following is the header for the NFS <TT
CLASS="LITERAL"
>start</TT
> script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>#!/bin/sh

# **************************************************************************
# *                                                                        *
# *                  Copyright (C) 1998 Silicon Graphics, Inc.             *
# *                                                                        *
# *  These coded instructions, statements, and computer programs  contain  *
# *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
# *  are protected by Federal copyright law.  They  may  not be disclosed  *
# *  to  third  parties  or copied or duplicated in any form, in whole or  *
# *  in part, without the prior written consent of Silicon Graphics, Inc.  *
# *                                                                        *
# **************************************************************************

#ident "$Revision: 1.2 $"

# Resource type: NFS
# Start script NFS

#
# Test resource configuration information is present in the database in
# the following format
#
# resource-type.NFS</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1157"
>2.4.2. Set Local Variables</A
></H2
><P
> The <B
CLASS="COMMAND"
>set_local_variables()</B
> section of the script defines all of the variables that are local
to the script, such as temporary file names or database keys. All local variables
should use the <TT
CLASS="LITERAL"
>LOCAL_</TT
> prefix. You must modify the code
as needed.</P
><P
>Following is the <B
CLASS="COMMAND"
>set_local_variables()</B
> section from
the NFS <TT
CLASS="LITERAL"
>start</TT
> script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>set_local_variables()
{
    LOCAL_TEST_KEY=NFS
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1177"
>2.4.3. Read Resource Information</A
></H2
><P
>The &#8194;<B
CLASS="COMMAND"
>get_</B
><TT
CLASS="REPLACEABLE"
><I
>xxx</I
></TT
><B
CLASS="COMMAND"
>_info()</B
> function, such as <B
CLASS="COMMAND"
>get_nfs_info()</B
>, reads the resource information from the cluster configuration
database. <TT
CLASS="LITERAL"
>$1</TT
> is the test resource name. If the operation
is successful, a value of 0 is returned; if the operation fails, 1 is returned. </P
><P
>The information is returned in the <TT
CLASS="LITERAL"
>HA_STRING</TT
> variable.
For more information about <TT
CLASS="LITERAL"
>HA_STRING</TT
>, see <A
HREF="z944252972lhj.html"
>Appendix B</A
>.</P
><P
>Following is the <B
CLASS="COMMAND"
>get_nfs_info()</B
> section from the
NFS <TT
CLASS="LITERAL"
>start</TT
> script</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>get_nfs_info ()
{
    ha_get_info ${LOCAL_TEST_KEY} $1
    if [ $? -ne 0 ]; then
        return 1;
    else
        return 0;
    fi
}</PRE
></TD
></TR
></TABLE
><P
>If you wish to get resource dependency information, you can call <TT
CLASS="LITERAL"
>ha_get_info</TT
> with a third argument of any value. The resource dependency
 list will be returned in the <TT
CLASS="LITERAL"
>HA_STRING</TT
> variable. </P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1206"
>2.4.4. Exit Status</A
></H2
><P
>In the <B
CLASS="COMMAND"
>exit_script()</B
> function, <TT
CLASS="LITERAL"
>$1</TT
> contains the <B
CLASS="COMMAND"
>exit_status</B
> value. If cleanup actions are required, such as the removal of temporary
files that were created as part of the process, place them before the <TT
CLASS="LITERAL"
>exit</TT
> line. </P
><P
>Following is the <B
CLASS="COMMAND"
>exit_script()</B
> section from the NFS <TT
CLASS="LITERAL"
>start</TT
> script</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>exit_script()
{
    exit $1;
}</PRE
></TD
></TR
></TABLE
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>If you call the <B
CLASS="COMMAND"
>exit_script</B
> function prior to normal
termination, it should be preceded by the  <B
CLASS="COMMAND"
>ha_write_status_for_resource</B
> function and you should use the same return code that is logged
to the output file.  For more information see <A
HREF="z944252972lhj.html"
>Appendix B</A
>. </P
></BLOCKQUOTE
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1237"
>2.4.5. Basic Action</A
></H2
><P
>This area of the script is the portion you must customize. The templates
provide a minimal framework. </P
><P
>Following is the framework for the basic action from the <TT
CLASS="FILENAME"
>start</TT
> template:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>start_template()

# for all template resources passed as parameter
for TEMPLATE in $HA_RES_NAMES
do
    #HA_CMD="<TT
CLASS="REPLACEABLE"
><I
>command to start $TEMPLATE resource on the local machine</I
></TT
>";

    #ha_execute_cmd "<TT
CLASS="REPLACEABLE"
><I
>string to describe the command being executed</I
></TT
>";

    ha_write_status_for_resource $TEMPLATE $HA_SUCCESS;
done
}</PRE
></TD
></TR
></TABLE
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>When testing the script, you can obtain debugging information by adding
the shell command <B
CLASS="COMMAND"
> set -x </B
> to this section.</P
></BLOCKQUOTE
></DIV
><P
>For examples of this area, see <A
HREF="le49536-parent.html"
>Section 2.6</A
>.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1254"
>2.4.6. Set Global Variables</A
></H2
><P
>The following lines set all of the global and local variables and store
the resource names in <TT
CLASS="LITERAL"
>$HA_RES_NAMES</TT
>.  </P
><P
>Following is the <B
CLASS="COMMAND"
>set_global_variables()</B
> function from the NFS <TT
CLASS="FILENAME"
>start</TT
> script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>set_global_variables()
{
    HA_DIR=/usr/lib/failsafe
    COMMON_LIB=${HA_DIR}/common_scripts/scriptlib

    # Execute the common library file
    . $COMMON_LIB

    ha_set_global_defs;
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1271"
>2.4.7. Verify Arguments</A
></H2
><P
>The <B
CLASS="COMMAND"
>ha_check_args()</B
> function
verifies the arguments and stores them in the <TT
CLASS="LITERAL"
>$HA_INFILE</TT
>
and <TT
CLASS="LITERAL"
>$HA_OUTFILE</TT
> variables. It returns 1 on error and 0
on success.</P
><P
>Following is the following is the section from the NFS start script
that calls <TT
CLASS="LITERAL"
>ha_check_args</TT
>:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_check_args $*;
if [ $? -ne 0 ]; then
    exit $HA_INVAL_ARGS;
fi</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1287"
>2.4.8. Read Input File</A
></H2
><P
>The <B
CLASS="COMMAND"
>ha_read_infile()</B
> function
reads the input file and stores the resource names in the <TT
CLASS="LITERAL"
>$HA_RES_NAMES</TT
> variable.</P
><P
>Following is the <B
CLASS="COMMAND"
>ha_read_infile()</B
> function from the
common library file <TT
CLASS="LITERAL"
>scriptlib</TT
>:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>ha_read_infile()
{
    HA_RES_NAMES="";

    for HA_RESOURCE in `cat ${HA_INFILE}`
    do
        HA_TMP="${HA_RES_NAMES} ${HA_RESOURCE}";
        HA_RES_NAMES=${HA_TMP};
    done
}</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN1303"
>2.4.9. Complete the Action</A
></H2
><P
>Located at the bottom of the script file are the lines which perform
the actual work of the requested action using the prior sections and provided
tools.  The results are written as output to  <TT
CLASS="LITERAL"
>$HA_OUTFILE</TT
>:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
><TT
CLASS="REPLACEABLE"
><I
>action</I
></TT
>_<TT
CLASS="REPLACEABLE"
><I
>resourcetype</I
></TT
>;

exit_script $HA_SUCCESS</PRE
></TD
></TR
></TABLE
><P
>Following is the completion from the NFS <TT
CLASS="FILENAME"
>start</TT
>
script:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>start_nfs;

exit_script $HA_SUCCESS;</PRE
></TD
></TR
></TABLE
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z942786569lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z942786601lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Preparation</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Steps in Writing a Script</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z942786601lhj.html010064400016050000001000000064760717757005600151450ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Steps in Writing a Script</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="PREVIOUS"
TITLE="Script Format"
HREF="z942786582lhj.html"><LINK
REL="NEXT"
TITLE="Examples of Action Scripts"
HREF="le49536-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z942786582lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le49536-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z942786601LHJ"
>2.5. Steps in Writing a Script</A
></H1
><DIV
CLASS="CAUTION"
><P
></P
><TABLE
CLASS="CAUTION"
BORDER="1"
WIDTH="100%"
><TR
><TD
ALIGN="CENTER"
><B
>Caution</B
></TD
></TR
><TR
><TD
ALIGN="LEFT"
><P
>Multiple copies of actions scripts can execute at the same time. Therefore,
all temporary file names must be unique within the storage space used. Often
adding a  <TT
CLASS="LITERAL"
>script.$$</TT
> to the name is sufficient. If multiple nodes share a temporary
directory, you will also want to incorporate host identifier to ensure uniqueness.
 Another method is to use the resource name because it must be unique to the
cluster.</P
></TD
></TR
></TABLE
></DIV
><P
>For each script, you must do the following:</P
><P
></P
><UL
><LI
><P
>Get the required variables</P
></LI
><LI
><P
>Check the variables</P
></LI
><LI
><P
>Perform the action</P
></LI
><LI
><P
>Check the action</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The <TT
CLASS="LITERAL"
>start</TT
> and <TT
CLASS="LITERAL"
>stop</TT
> scripts are
required to be <I
CLASS="FIRSTTERM"
>idempotent</I
>; that is, they have the appearance
of being run once but can in fact be run multiple times. For example, if the <TT
CLASS="LITERAL"
>start</TT
> script is run for a resource that is already started, the
script must not return an error.</P
></BLOCKQUOTE
></DIV
><P
>All action scripts must return the status to the  <TT
CLASS="FILENAME"
>/var/log/failsafe/script_<TT
CLASS="REPLACEABLE"
><I
>nodename</I
></TT
></TT
> file.</P
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z942786582lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le49536-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Script Format</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Examples of Action Scripts</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z942786646lhj.html010064400016050000001000000132050717757006700151440ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Monitoring Agents</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="PREVIOUS"
TITLE="Examples of Action Scripts"
HREF="le49536-parent.html"><LINK
REL="NEXT"
TITLE="Creating a Failover Policy"
HREF="le16529-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le49536-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le16529-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z942786646LHJ"
>2.7. Monitoring Agents</A
></H1
><P
>If resources cannot be monitored using a lightweight check, you should
use a <I
CLASS="FIRSTTERM"
>monitoring agent</I
>. The <TT
CLASS="LITERAL"
>monitor</TT
>
action script contacts the monitoring agent to determine the status of the
resource in the node. The monitoring agent in turn periodically monitors the
resource. <A
HREF="z942786646lhj.html#Z943376870LHJ"
>Figure 2-1</A
> shows the monitoring process.</P
><DIV
CLASS="FIGURE"
><A
NAME="Z943376870LHJ"
></A
><P
><B
>Figure 2-1. Monitoring Process</B
></P
><P
><IMG
SRC="figures/monitor.gif"></P
></DIV
><P
>Monitoring agents are useful for monitoring database resources. In databases,
creating the database connection is costly and time consuming. The monitoring
agent maintains connections to the database and it queries the database using
the connection in response to the <TT
CLASS="LITERAL"
>monitor</TT
> action script
request.</P
><P
>Monitoring agents are independent processes and can be started by <TT
CLASS="LITERAL"
>cmond</TT
> process, although this is not required. For example, if a
monitoring agent must be started when activating highly available services
on a node, information about that agent can be added to the <TT
CLASS="LITERAL"
>cmond</TT
>
configuration on that node. The <TT
CLASS="LITERAL"
>cmond</TT
> configuration is
located in the  <TT
CLASS="FILENAME"
>/etc/failsafe/cmon_process_groups</TT
> directory.
Information about different agents should go into different files. The name
of the file is not relevant to the activate/deactivate procedure. </P
><P
>If a monitoring agent exits or aborts, <TT
CLASS="LITERAL"
>cmond</TT
> will
automatically restart the monitoring agent. This prevents <TT
CLASS="LITERAL"
>monitor</TT
> action script failures due to monitoring agent failures.</P
><P
>For example, the <TT
CLASS="FILENAME"
>/etc/failsafe/cmon_process_groups/ip_addresses</TT
> file contains information about the <TT
CLASS="LITERAL"
>ha_ifd</TT
> process that monitors network interfaces. It contains the
following,  where <TT
CLASS="LITERAL"
>ACTIONS</TT
> represents what <TT
CLASS="LITERAL"
>cmond</TT
> can perform on the agents (which will be the same for all scripts):</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>TYPE = cluster_agent
PROCS = ha_ifd
ACTIONS = start stop restart attach detach
AUTOACTION = attach</PRE
></TD
></TR
></TABLE
><P
>If you create a new monitoring agent, you must also create a corresponding
file in the <TT
CLASS="FILENAME"
>/etc/failsafe/cmon_process_groups</TT
> directory that contains similar information
about the new agent. To do this, you can copy the <TT
CLASS="FILENAME"
>ip_addresses</TT
>
file and modify the <TT
CLASS="LITERAL"
>PROCS</TT
> line to list the executables
that constitute your new agent. These processes must be located in the  <TT
CLASS="FILENAME"
>/usr/lib/failsafe/bin</TT
> directory. You should not modify the other
configuration lines (<TT
CLASS="LITERAL"
>TYPE</TT
>, <TT
CLASS="LITERAL"
>ACTIONS</TT
>, and <TT
CLASS="LITERAL"
>AUTOACTION</TT
>).</P
><P
>Suppose you need to add a new agent called <TT
CLASS="LITERAL"
>newagent</TT
>
that consists of processes <TT
CLASS="LITERAL"
>ha_x</TT
> and <TT
CLASS="LITERAL"
>ha_y</TT
>.
 The configuration information for this agent will be located in the  <TT
CLASS="FILENAME"
>/etc/failsafe/cmon_process_groups/newagent</TT
> file,
which will contain the following:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>TYPE = cluster_agent
PROCS = ha_x ha_y
ACTIONS = start stop restart attach detach
AUTOACTION = attach</PRE
></TD
></TR
></TABLE
><P
>In this case, the software will expect two executables (<TT
CLASS="FILENAME"
>/usr/lib/failsafe/bin/ha_x</TT
> and <TT
CLASS="FILENAME"
>/usr/lib/failsafe/bin/ha_y</TT
>) to be present.</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le49536-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le16529-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Examples of Action Scripts</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Creating a Failover Policy</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z942787505lhj.html010064400016050000001000000330540717757003600151370ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Understanding the Execution of Action Scripts</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Writing the Action Scripts and Adding Monitoring
Agents"
HREF="le77672-parent.html"><LINK
REL="PREVIOUS"
TITLE="Set of Action Scripts"
HREF="z942786554lhj.html"><LINK
REL="NEXT"
TITLE="Preparation"
HREF="z942786569lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z942786554lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Writing the Action Scripts and Adding Monitoring
Agents</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z942786569lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z942787505LHJ"
>2.2. Understanding the Execution of Action Scripts</A
></H1
><P
>Before you can write a new action script, you must understand how action
scripts are executed. This section covers the following topics:<P
></P
><UL
><LI
><P
><A
HREF="z942787505lhj.html#Z944249968LHJ"
>Section 2.2.1</A
></P
></LI
><LI
><P
><A
HREF="z942787505lhj.html#Z943309055LHJ"
>Section 2.2.2</A
></P
></LI
><LI
><P
><A
HREF="z942787505lhj.html#Z942863078LHJ"
>Section 2.2.3</A
></P
></LI
><LI
><P
><A
HREF="z942787505lhj.html#Z944596365SMG"
>Section 2.2.4</A
></P
></LI
><LI
><P
><A
HREF="z942787505lhj.html#Z944596427SMG"
>Section 2.2.5</A
></P
></LI
><LI
><P
><A
HREF="z942787505lhj.html#Z944596453SMG"
>Section 2.2.6</A
></P
></LI
></UL
></P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="Z944249968LHJ"
>2.2.1. Multiple Instances of Script Executed at the Same
Time</A
></H2
><P
>Multiple instances of the same script may be executed at the same time.
To avoid problems this may cause, you can use the <TT
CLASS="LITERAL"
>ha_filelock</TT
>
and <TT
CLASS="LITERAL"
>ha_execute_lock</TT
> commands to achieve sequential execution
of commands in different instances of the same script.</P
><P
>For example, consider a script which modifies a configuration file to
start a new application instance.  Multiple instances of the script modifying
the file simultaneously could cause file corruption and data loss.  The start
script for the application should use <TT
CLASS="LITERAL"
>ha_execute_lock</TT
> when
executing the modification script to ensure correct configuration file modification.</P
><P
>Assuming the script is named <TT
CLASS="LITERAL"
>modify_configuration_file</TT
>,
the start script would contain a statement similar to the following:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>${HA_CMDSPATH}/ha_execute_lock 30
    ${HA_SCRIPTTMPDIR}/lock.volume_assemble \"modify_configuration_file\"</PRE
></TD
></TR
></TABLE
><P
>The <TT
CLASS="LITERAL"
>ha_execute_lock</TT
> command takes 3 arguments:<P
></P
><UL
><LI
><P
>Number of seconds before the command times out waiting for
the file lock</P
></LI
><LI
><P
>File to be used for locking</P
></LI
><LI
><P
>Command to be executed</P
></LI
></UL
></P
><P
>The <B
CLASS="COMMAND"
>ha_execute_lock</B
> command tries to obtain a lock
on the file every second for <TT
CLASS="REPLACEABLE"
><I
>timeout</I
></TT
> seconds. After
obtaining a lock on the file, it executes the command argument. On command
completion, it releases lock on the file.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="Z943309055LHJ"
>2.2.2. Differences between the <TT
CLASS="FILENAME"
>exclusive</TT
> and <TT
CLASS="FILENAME"
>monitor</TT
> Scripts</A
></H2
><P
>Although the same check can be used in <TT
CLASS="LITERAL"
>monitor</TT
> and <TT
CLASS="LITERAL"
>exclusive</TT
> action scripts, they are used for different purposes. <A
HREF="z942787505lhj.html#Z943038525LHJ-PARENT"
>Table 2-1</A
> summarizes the differences between the scripts.</P
><DIV
CLASS="TABLE"
><A
NAME="Z943038525LHJ-PARENT"
></A
><P
><B
>Table 2-1. Differences Between the <TT
CLASS="LITERAL"
>monitor</TT
>
and <TT
CLASS="LITERAL"
>exclusive</TT
> Action Scripts</B
></P
><TABLE
BORDER="1"
WIDTH="100%"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="50%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
><TT
CLASS="LITERAL"
>exclusive</TT
></P
></TH
><TH
WIDTH="50%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
><TT
CLASS="LITERAL"
>monitor</TT
></P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Executed in all nodes in the cluster.</P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Executed only on the node where the
resource group (which contains the resource) is online.</P
></TD
></TR
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Executed before the resource is started
in the cluster.</P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Executed when the resource is online
in the cluster. (The <TT
CLASS="LITERAL"
>monitor</TT
> script could degrade the services
provided by the HA server. Therefore, the check performed by the <TT
CLASS="LITERAL"
>monitor</TT
> script should be lightweight and less time consuming than
the check performed by the <TT
CLASS="LITERAL"
>exclusive</TT
> script))</P
></TD
></TR
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Executed only once before the resource
group is made online in the cluster.</P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Executed periodically.</P
></TD
></TR
><TR
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Failure will result in resource group
not becoming online in the cluster.</P
></TD
><TD
WIDTH="50%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Failure will cause a resource group
failover to another node or a restart of the resource in the local node. An
error will cause false resource group failovers in the cluster.</P
></TD
></TR
></TBODY
></TABLE
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="Z942863078LHJ"
>2.2.3. Successful Execution of Action Scripts</A
></H2
><P
><A
HREF="z942787505lhj.html#LE81926-PARENT"
>Table 2-2</A
> shows the state of a resource group
after the successful execution of an action script for every resource within
a resource group. To view the state of a resource group, use the Cluster Manager
graphical user interface (GUI) or the <TT
CLASS="LITERAL"
>cluster_mgr</TT
> command.</P
><DIV
CLASS="TABLE"
><A
NAME="LE81926-PARENT"
></A
><P
><B
>Table 2-2. Successful Action Script Results </B
></P
><TABLE
BORDER="1"
WIDTH="100%"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="46%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Event</P
></TH
><TH
WIDTH="29%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Action Script to Execute</P
></TH
><TH
WIDTH="26%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Resource Group State</P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="46%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Resource group is made online on a
node</P
></TD
><TD
WIDTH="29%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>start</TT
></P
></TD
><TD
WIDTH="26%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
></TR
><TR
><TD
WIDTH="46%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Resource group is made offline on a
node</P
></TD
><TD
WIDTH="29%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>stop</TT
></P
></TD
><TD
WIDTH="26%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>offline</TT
></P
></TD
></TR
><TR
><TD
WIDTH="46%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Online status of the resource group</P
></TD
><TD
WIDTH="29%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>exclusive</TT
></P
></TD
><TD
WIDTH="26%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>(No effect)</P
></TD
></TR
><TR
><TD
WIDTH="46%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Normal monitoring of online resource
group</P
></TD
><TD
WIDTH="29%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>monitor</TT
></P
></TD
><TD
WIDTH="26%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
></TR
><TR
><TD
WIDTH="46%"
ALIGN="LEFT"
VALIGN="TOP"
><P
>Resource group monitoring failure</P
></TD
><TD
WIDTH="29%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>restart</TT
></P
></TD
><TD
WIDTH="26%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
></TR
></TBODY
></TABLE
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="Z944596365SMG"
>2.2.4. Failure of Action Scripts</A
></H2
><P
><A
HREF="z942787505lhj.html#LE53980-PARENT"
>Table 2-3</A
> shows the state of the resource group
and the error state when an action script fails.</P
><DIV
CLASS="TABLE"
><A
NAME="LE53980-PARENT"
></A
><P
><B
>Table 2-3. Failure of an Action Script</B
></P
><TABLE
BORDER="1"
CLASS="CALSTABLE"
><THEAD
><TR
><TH
WIDTH="33%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Failing Action Script</P
></TH
><TH
WIDTH="33%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Resource Group State</P
></TH
><TH
WIDTH="33%"
ALIGN="LEFT"
VALIGN="BOTTOM"
><P
>Error State</P
></TH
></TR
></THEAD
><TBODY
><TR
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>exclusive</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>exclusivity</TT
></P
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>monitor</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>monitoring failure</TT
></P
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>restart</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>monitoring failure</TT
></P
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>start</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>srmd executable error</TT
></P
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>stop</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>online</TT
></P
></TD
><TD
WIDTH="33%"
ALIGN="LEFT"
VALIGN="TOP"
><P
><TT
CLASS="LITERAL"
>srmd executable error</TT
></P
></TD
></TR
></TBODY
></TABLE
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="Z944596427SMG"
>2.2.5. Implementing Timeouts and Retrying a Command</A
></H2
><P
>You can use the <B
CLASS="COMMAND"
>ha_exec2</B
> command to execute action
scripts using timeouts. This allows the action script to be completed within
the specified time, and permits proper error messages to be logged on failure
or timeout. The <TT
CLASS="REPLACEABLE"
><I
>retry</I
></TT
> variable is especially useful
in <TT
CLASS="LITERAL"
>monitor</TT
> and <TT
CLASS="LITERAL"
>exclusive</TT
> action scripts.</P
><P
>To retry a command, use the following syntax:<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>/usr/lib/failsafe/bin/ha_exec2 <TT
CLASS="REPLACEABLE"
><I
>timeout_in_seconds number_of_retries command_to_be_executed</I
></TT
></PRE
></TD
></TR
></TABLE
></P
><P
>For example:<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>${HA_CMDSPATH}/ha_exec2 30 2 "umount /fs"</PRE
></TD
></TR
></TABLE
></P
><P
>The above <TT
CLASS="LITERAL"
>ha_exec2</TT
> command executes the <TT
CLASS="LITERAL"
>umount /fs</TT
> command line. If the command does not complete within
30 seconds, it kills the <B
CLASS="COMMAND"
>umount</B
> command and retries the
command. The <B
CLASS="COMMAND"
>ha_exec2</B
> command retries the <TT
CLASS="LITERAL"
>umount</TT
> command 2 times if it times out or fails.</P
><P
>For more information, see the <B
CLASS="COMMAND"
>ha_exec2</B
> man page.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="Z944596453SMG"
>2.2.6. Sending UNIX Signals</A
></H2
><P
>You can use the <B
CLASS="COMMAND"
>ha_exec2</B
> command to send UNIX signals
to specific process. A process is identified by its name or its arguments.</P
><P
>For example:<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>${HA_CMDSPATH}/ha_exec2 -s 0 -t "knfsd"</PRE
></TD
></TR
></TABLE
></P
><P
>The above command sends signal 0 (checks if the process exists) to all
processes whose name or arguments match the string <TT
CLASS="LITERAL"
>knfsd</TT
>.
The command returns 0 if it is a success.</P
><P
>You should use the <TT
CLASS="LITERAL"
>ha_exec2</TT
> command to check for
server processes in the <TT
CLASS="LITERAL"
>monitor</TT
> script instead of using
a <TT
CLASS="LITERAL"
> ps -ef | grep </TT
> command line construction, for performance
and speed considerations. </P
><P
>For more information, see the <B
CLASS="COMMAND"
>ha_exec2</B
> man page.</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z942786554lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z942786569lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Set of Action Scripts</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le77672-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Preparation</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>ng a lock on the file, it executes the command argument. On command
completion, it releases lock on the file.</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="Z943309055LHJ"
>2.2.2. Differences between the <TT
CLASS="FILENAME"
>exclusive</TT
> and <TT
CLASS="FILENAME"
>monitor</TT
> Scripts</A
></H2
><P
>Although the same check can be used in <TT
CLASS="LITERAL"
>monitor</TT
> and <TT
CLASS="LITERAL"
>exclusive</TT
> action scripts, they are used for difhtml/z943897815lhj.html010064400016050000001000000064600717757016200151470ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Starting the FailSafe Manager</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Special Testing Considerations for the monitor Script"
HREF="x2482.html"><LINK
REL="NEXT"
TITLE="Using the SRM Script Library"
HREF="z944252972lhj.html"></HEAD
><BODY
CLASS="APPENDIX"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2482.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z944252972lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="APPENDIX"
><H1
><A
NAME="Z943897815LHJ"
>Appendix A. Starting the FailSafe Manager</A
></H1
><P
>To start the FailSafe Manager, use one of these methods:</P
><P
></P
><UL
><LI
><P
>On a system with <TT
CLASS="LITERAL"
>sysadm_failsafe2-client</TT
> and KDE or GNOME installed, choose "FailSafe
Manager" from the Applications menu.  (After installing <TT
CLASS="LITERAL"
>sysadm_failsafe2-client</TT
>, you may
need to restart the desktop's launch bar before the Failsafe Manager will
show up in the Applications menu.  (To do this in KDE, right-click on the
panel and select Restart from the menu.)</P
></LI
><LI
><P
>On a system with  <TT
CLASS="LITERAL"
>sysadm_failsafe2-client</TT
>
installed, enter the following command line: <TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>$ <TT
CLASS="USERINPUT"
><B
>/usr/bin/fstask</B
></TT
></PRE
></TD
></TR
></TABLE
></P
></LI
><LI
><P
>In your web browser, enter the following, where <TT
CLASS="REPLACEABLE"
><I
>server</I
></TT
> is the name of the node in the pool or cluster that you
want to administer:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
><TT
CLASS="USERINPUT"
><B
>http://server/FailSafeManager/</B
></TT
></PRE
></TD
></TR
></TABLE
><P
>At the resulting Web page, click on the icon.  The server must have <TT
CLASS="LITERAL"
>sysadm_failsafe2-web</TT
> installed.</P
></LI
></UL
><P
><A
HREF="z943897815lhj.html#Z942424754GLEN"
>Figure A-1</A
>, shows the FailSafe Manager.</P
><DIV
CLASS="FIGURE"
><A
NAME="Z942424754GLEN"
></A
><P
><B
>Figure A-1. FailSafe Manager</B
></P
><P
><IMG
SRC="figures/manager.ai.gif"></P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2482.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z944252972lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Special Testing Considerations for the <TT
CLASS="LITERAL"
>monitor</TT
> Script</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Using the SRM Script Library</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z943900191lhj.html010064400016050000001000000064260717757015200151260ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Debugging Notes</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Testing Scripts"
HREF="le96600-parent.html"><LINK
REL="PREVIOUS"
TITLE="General Testing and Debugging Techniques"
HREF="x2321.html"><LINK
REL="NEXT"
TITLE="Testing an Action Script"
HREF="x2401.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x2321.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 5. Testing Scripts</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2401.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z943900191LHJ"
>5.2. Debugging Notes</A
></H1
><P
><P
></P
><UL
><LI
><P
>The <TT
CLASS="LITERAL"
>exclusive</TT
> script returns an error when the resource is running in the local node. If the resource is actually running in the node, there is no <TT
CLASS="LITERAL"
>exclusive</TT
> action script bug.</P
></LI
><LI
><P
>If the resource group does not become online on the primary node, it can be because of a <TT
CLASS="LITERAL"
>start</TT
> script error on the primary node or a <TT
CLASS="LITERAL"
>monitor</TT
> script error on the primary node. The nature of the failure can be seen in the <TT
CLASS="LITERAL"
>srmd</TT
> logs of the primary node.</P
></LI
><LI
><P
>If the action script failure status is <TT
CLASS="LITERAL"
>timeout</TT
>, resource type timeouts for the action should be increased. In the case of the <TT
CLASS="LITERAL"
>monitor</TT
> script, the check can be made more lightweight.</P
></LI
><LI
><P
>The resource type action script timeouts are for a resource. So, if an action is performed on two resources, the script timeout is twice the configured resource type action timeout.</P
></LI
><LI
><P
>If the resource group has a configuration error, check the <TT
CLASS="LITERAL"
>srmd</TT
> logs on the primary node for errors.</P
></LI
><LI
><P
>The action scripts that use <TT
CLASS="LITERAL"
>${HA_LOG}</TT
> and <TT
CLASS="LITERAL"
>${HA_DBGLOG}</TT
> macros to log messages can find the messages in <TT
CLASS="FILENAME"
>/var/log/failsafe/script_<TT
CLASS="REPLACEABLE"
><I
>nodename</I
></TT
></TT
> file in each node in the cluster.</P
></LI
></UL
></P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x2321.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2401.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>General Testing and Debugging Techniques</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le96600-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Testing an Action Script</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z943900385lhj.html010064400016050000001000000105460717757013200151270ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Using the GUI</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Defining a New Resource Type"
HREF="le43007-parent.html"><LINK
REL="PREVIOUS"
TITLE="Defining a New Resource Type"
HREF="le43007-parent.html"><LINK
REL="NEXT"
TITLE="Using cluster_mgr Interactively"
HREF="z943900404lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="le43007-parent.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 4. Defining a New Resource Type</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z943900404lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z943900385LHJ"
>4.1. Using the GUI</A
></H1
><P
>You can use the FailSafe Manager graphical user interface (GUI) to define
a new resource type and to define the dependencies for a given type. For details
about the GUI, see the <I
CLASS="CITETITLE"
>Linux FailSafe  Administrator's Guide</I
>.
For convenience, <A
HREF="z943897815lhj.html"
>Appendix A</A
>, contains information about
starting the GUI.</P
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2110"
>4.1.1. Define a New Resource Type</A
></H2
><P
>To define a new resource type using the GUI, select the following task:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>Resources &#38; Resource Types =&#62; Define a Resource Type</PRE
></TD
></TR
></TABLE
><P
>The GUI will prompt you for required and optional information. Online
help is provided for each item.</P
><P
>The following figures show this process for a new resource type called <TT
CLASS="LITERAL"
>newresourcetype</TT
>.</P
><DIV
CLASS="FIGURE"
><A
NAME="Z942424847GLEN"
></A
><P
><B
>Figure 4-1. Select <SPAN
CLASS="INTERFACE"
>Define a New Resource</SPAN
></B
></P
><P
><IMG
SRC="figures/resource.ai.gif"></P
></DIV
><DIV
CLASS="FIGURE"
><A
NAME="Z942424883GLEN"
></A
><P
><B
>Figure 4-2. Specify the Name of the New Resource Type</B
></P
><P
><IMG
SRC="figures/type.ai.gif"></P
></DIV
><DIV
CLASS="FIGURE"
><A
NAME="Z942424567GLEN"
></A
><P
><B
>Figure 4-3. Specify Settings for Required Actions</B
></P
><P
><IMG
SRC="figures/action.ai.gif"></P
></DIV
><DIV
CLASS="FIGURE"
><A
NAME="Z942424823GLEN"
></A
><P
><B
>Figure 4-4. Change Settings for Optional Actions</B
></P
><P
><IMG
SRC="figures/optional.ai.gif"></P
></DIV
><DIV
CLASS="FIGURE"
><A
NAME="Z942424617GLEN"
></A
><P
><B
>Figure 4-5. Set Type-specific Attributes</B
></P
><P
><IMG
SRC="figures/attrib.ai.gif"></P
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN2136"
>4.1.2. Define Dependencies</A
></H2
><P
>To define the dependencies for a given type use the following task:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>Add/Remove Dependencies for a Resource Type</PRE
></TD
></TR
></TABLE
><P
><A
HREF="z943900385lhj.html#Z942424684GLEN"
>Figure 4-6</A
> shows an example of adding two dependencies
(<TT
CLASS="LITERAL"
>filesystem</TT
> and <TT
CLASS="LITERAL"
>NFS</TT
>) to the <TT
CLASS="LITERAL"
>newresourcetype</TT
> resource type.</P
><DIV
CLASS="FIGURE"
><A
NAME="Z942424684GLEN"
></A
><P
><B
>Figure 4-6. Add Dependencies</B
></P
><P
><IMG
SRC="figures/depend.ai.gif"></P
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="le43007-parent.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z943900404lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Defining a New Resource Type</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le43007-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> Interactively</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z943900404lhj.html010064400016050000001000000222170717757013500151200ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Using cluster_mgr Interactively</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Defining a New Resource Type"
HREF="le43007-parent.html"><LINK
REL="PREVIOUS"
TITLE="Using the GUI"
HREF="z943900385lhj.html"><LINK
REL="NEXT"
TITLE="Using cluster_mgr With a Script"
HREF="z943900431lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z943900385lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 4. Defining a New Resource Type</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z943900431lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z943900404LHJ"
>4.2. Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> Interactively</A
></H1
><P
>The following steps show the use of <TT
CLASS="LITERAL"
>cluster_mgr</TT
> interactively
to define a resource type called <TT
CLASS="LITERAL"
>newresourcetype</TT
>. Note
that you can have multiple resource types.  For example, if you want to have
some IP addresses that allow local restart (restart mode = 0) and some that
do not (restart mode = 1), you can copy the <TT
CLASS="LITERAL"
>IP_address</TT
>
type to a new type named <TT
CLASS="LITERAL"
>IP_address2</TT
> and change just that
value in the <TT
CLASS="LITERAL"
>IP_address2</TT
>.   </P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>A resource type name cannot contain a space, an unprintable character,
or any of the following characters: <P
CLASS="LITERALLAYOUT"
>*&nbsp;<br>
?&nbsp;<br>
\&nbsp;<br>
#</P
></P
></BLOCKQUOTE
></DIV
><P
></P
><OL
TYPE="1"
><LI
><P
>Log in as <B
CLASS="COMMAND"
>root</B
>.</P
></LI
><LI
><P
>Execute the <TT
CLASS="LITERAL"
>cluster_mgr </TT
>command using the <B
CLASS="COMMAND"
>-p</B
> option to prompt you for information (the command name can be
abbreviated to <TT
CLASS="LITERAL"
>cmgr</TT
>): </P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># <TT
CLASS="USERINPUT"
><B
>/usr/lib/failsafe/bin/cluster_mgr -p</B
></TT
>&#8194;
Welcome to Linux FailSafe Cluster Manager Command-Line Interface

cmgr&#62;</PRE
></TD
></TR
></TABLE
></LI
><LI
><P
>Use the <TT
CLASS="LITERAL"
>set</TT
> subcommand to specify the default
cluster used for <TT
CLASS="LITERAL"
>cluster_mgr</TT
> operations. In this example,
we use a cluster named <TT
CLASS="LITERAL"
>test</TT
>:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>set cluster test</B
></TT
>&#8194;</PRE
></TD
></TR
></TABLE
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>If you prefer, you can specify the cluster name as needed with each
subcommand.</P
></BLOCKQUOTE
></DIV
></LI
><LI
><P
>Use the <TT
CLASS="LITERAL"
>define resource_type</TT
> subcommand.
By default, the resource type will apply across the cluster; if you wish to
limit the resource type to a specific node, enter the node name when prompted.
If you wish to enable restart mode, enter 1 when prompted.</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>The following example only shows the prompts and answers for two action
scripts (<TT
CLASS="LITERAL"
>start</TT
> and <TT
CLASS="LITERAL"
>stop</TT
>) for a new resource
type named<TT
CLASS="LITERAL"
>newresourcetype</TT
>.</P
></BLOCKQUOTE
></DIV
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>define resource_type newresourcetype</B
></TT
>

(Enter "cancel" at any time to abort)

Node[optional]?
Order ? <TT
CLASS="USERINPUT"
><B
>300</B
></TT
>
Restart Mode ? (0)

DEFINE RESOURCE TYPE OPTIONS

        1) Add Action Script.
        2) Remove Action Script.
        3) Add Type Specific Attribute.
        4) Remove Type Specific Attribute.
        5) Add Dependency.
        6) Remove Dependency.
        7) Show Current Information.
        8) Cancel. (Aborts command)
        9) Done. (Exits and runs command)

Enter option:<TT
CLASS="USERINPUT"
><B
>1</B
></TT
>

No current resource type actions

Action name ? <TT
CLASS="USERINPUT"
><B
>start</B
></TT
>
Executable Time? <TT
CLASS="USERINPUT"
><B
>40000</B
></TT
>
Monitoring Interval? <TT
CLASS="USERINPUT"
><B
>0</B
></TT
>
Start Monitoring Time? <TT
CLASS="USERINPUT"
><B
>0</B
></TT
> 

        1) Add Action Script.
        2) Remove Action Script.
        3) Add Type Specific Attribute.
        4) Remove Type Specific Attribute.
        5) Add Dependency.
        6) Remove Dependency.
        7) Show Current Information.
        8) Cancel. (Aborts command)
        9) Done. (Exits and runs command)

Enter option:<TT
CLASS="USERINPUT"
><B
>1</B
></TT
>

Current resource type actions:
        Action - 1: start

Action name <TT
CLASS="USERINPUT"
><B
>stop</B
></TT
>
Executable Time? <TT
CLASS="USERINPUT"
><B
>40000</B
></TT
>
Monitoring Interval? <TT
CLASS="USERINPUT"
><B
>0</B
></TT
>
Start Monitoring Time? <TT
CLASS="USERINPUT"
><B
>0</B
></TT
> 

        1) Add Action Script.
        2) Remove Action Script.
        3) Add Type Specific Attribute.
        4) Remove Type Specific Attribute.
        5) Add Dependency.
        6) Remove Dependency.
        7) Show Current Information.
        8) Cancel. (Aborts command)
        9) Done. (Exits and runs command)

Enter option:<TT
CLASS="USERINPUT"
><B
>3</B
></TT
>

No current type specific attributes

Type Specific Attribute ? <TT
CLASS="USERINPUT"
><B
>integer-att</B
></TT
>
Datatype ? <TT
CLASS="USERINPUT"
><B
>integer</B
></TT
>
Default value[optional] ? <TT
CLASS="USERINPUT"
><B
>33</B
></TT
>&#8194;

        1) Add Action Script.
        2) Remove Action Script.
        3) Add Type Specific Attribute.
        4) Remove Type Specific Attribute.
        5) Add Dependency.
        6) Remove Dependency.
        7) Show Current Information.
        8) Cancel. (Aborts command)
        9) Done. (Exits and runs command)

Enter option:<TT
CLASS="USERINPUT"
><B
>3</B
></TT
>

Current type specific attributes:
        Type Specific Attribute - 1: export-point

Type Specific Attribute ? <TT
CLASS="USERINPUT"
><B
>string-att</B
></TT
>
Datatype ? <TT
CLASS="USERINPUT"
><B
>string</B
></TT
>
Default value[optional] ? <TT
CLASS="USERINPUT"
><B
>rw</B
></TT
>

        1) Add Action Script.
        2) Remove Action Script.
        3) Add Type Specific Attribute.
        4) Remove Type Specific Attribute.
        5) Add Dependency.
        6) Remove Dependency.
        7) Show Current Information.
        8) Cancel. (Aborts command)
        9) Done. (Exits and runs command)

Enter option:<TT
CLASS="USERINPUT"
><B
>5</B
></TT
>

No current resource type dependencies

Dependency name ? <TT
CLASS="USERINPUT"
><B
>filesystem</B
></TT
>

        1) Add Action Script.
        2) Remove Action Script.
        3) Add Type Specific Attribute.
        4) Remove Type Specific Attribute.
        5) Add Dependency.
        6) Remove Dependency.
        7) Show Current Information.
        8) Cancel. (Aborts command)
        9) Done. (Exits and runs command)

Enter option:<TT
CLASS="USERINPUT"
><B
>7</B
></TT
>

Current resource type actions:
        Action - 1: start
        Action - 2: stop

Current type specific attributes:
        Type Specific Attribute - 1: integer-att
        Type Specific Attribute - 2: string-att

No current resource type dependencies

Resource dependencies to be added:
        Resource dependency - 1: filesystem

        1) Add Action Script.
        2) Remove Action Script.
        3) Add Type Specific Attribute.
        4) Remove Type Specific Attribute.
        5) Add Dependency.
        6) Remove Dependency.
        7) Show Current Information.
        8) Cancel. (Aborts command)
        9) Done. (Exits and runs command)

Enter option:<TT
CLASS="USERINPUT"
><B
>9</B
></TT
>
Successfully defined resource_type newresourcetype

cmgr&#62; <TT
CLASS="USERINPUT"
><B
>show resource_types in cluster test</B
></TT
>

NFS
template
newresourcetype
statd
MAC_address
IP_address
filesystem
volume

cmgr&#62; <TT
CLASS="USERINPUT"
><B
>exit</B
></TT
>
# </PRE
></TD
></TR
></TABLE
></LI
></OL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z943900385lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z943900431lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Using the GUI</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le43007-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> With a Script</TD
></TR
></TABLE
></DIV
></BODY
></HTML
></TT
>) for a new resource
type named<TT
CLASS="LITERAL"
>newresourcetype</TT
>.</P
></BLOCKQUOTE
></DIV
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>define resource_type newresourcetype</B
></TT
>

(Enter "cancel" at any time to abort)

Node[optional]?
Order ? <TT
CLASS="USERINPUT"
><B
html/z943900431lhj.html010064400016050000001000000125500717757013700151210ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Using cluster_mgr With a Script</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Defining a New Resource Type"
HREF="le43007-parent.html"><LINK
REL="PREVIOUS"
TITLE="Using cluster_mgr Interactively"
HREF="z943900404lhj.html"><LINK
REL="NEXT"
TITLE="Testing a New Resource Type"
HREF="z943901162lhj.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z943900404lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 4. Defining a New Resource Type</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="z943901162lhj.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z943900431LHJ"
>4.3. Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> With a Script</A
></H1
><P
>You can write a script that contains all of the information required
to define a resource type and supply it to <TT
CLASS="LITERAL"
>cluster_mgr</TT
>
by using the <B
CLASS="COMMAND"
>-f</B
> option:</P
><P
CLASS="LITERALLAYOUT"
>cluster_mgr&nbsp;-f&nbsp;<TT
CLASS="REPLACEABLE"
><I
>scriptname</I
></TT
></P
><P
>Or, you could include the following as the first line of the script
and then execute the script itself:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>#!/usr/lib/failsafe/bin/cluster_mgr -f</PRE
></TD
></TR
></TABLE
><P
>If any line of the script fails, <TT
CLASS="LITERAL"
>cluster_mgr</TT
> will
exit. You can choose to ignore the failure and continue the process by using
the -i option, as follows:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>#!/usr/lib/failsafe/bin/cluster_mgr -if</PRE
></TD
></TR
></TABLE
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>If you include <B
CLASS="COMMAND"
>-i</B
> when using a cluster_mgr command
line as the first line of the script, you must use this exact syntax (that
is, <B
CLASS="COMMAND"
>-if</B
>).</P
></BLOCKQUOTE
></DIV
><P
>A template script for creating
a new resource type is located in  <TT
CLASS="FILENAME"
>/usr/lib/failsafe/cmgr-templates/cmgr-create-resource_type</TT
> .  Each line of the script must be a valid <TT
CLASS="LITERAL"
>cluster_mgr</TT
> line, a comment line (starting with #), or a blank line.</P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>You must include a <TT
CLASS="LITERAL"
>done</TT
> command line to finish a
multi-level command. If you concatenate information from multiple template
scripts to prepare your cluster configuration, you must remove the <TT
CLASS="LITERAL"
>quit</TT
> at the end of each template script.</P
></BLOCKQUOTE
></DIV
><P
>For example, you could use the following script to define the same <TT
CLASS="LITERAL"
>newresourcetype</TT
> resource type defined interactively in the previous
section:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># newresourcetype.script: Script to define the "newresourcetype" resource type

set cluster test
define resource_type newresourcetype
set order to 300
set restart_mode to 0
add action start
set exec_time to 40000
set monitor_interval to 0
set monitor_time to 0
done
add action stop
set exec_time to 40000
set monitor_interval to 0
set monitor_time to 0
done
add type_attribute integer-att
set data_type to integer
set default_value to 33
done
add type_attribute string-att
set data_type to string
set default_value to rw
done
add dependency filesystem
done
quit</PRE
></TD
></TR
></TABLE
><P
>When you execute the <TT
CLASS="LITERAL"
>cluster_mgr -f</TT
> command line
with this script, you will see the following output:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># <TT
CLASS="USERINPUT"
><B
>/usr/lib/failsafe/bin/cluster_mgr -f newresourcetype.script</B
></TT
>
Successfully defined resource_type newresourcetype

# </PRE
></TD
></TR
></TABLE
><P
>To verify that the resource type was defined, enter the following:</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
># /<TT
CLASS="USERINPUT"
><B
>usr/lib/failsafe/bin/cluster_mgr -c "show resource_types in cluster test"</B
></TT
>

NFS
template
newresourcetype
statd
MAC_address
IP_address
filesystem
volume</PRE
></TD
></TR
></TABLE
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z943900404lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="z943901162lhj.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> Interactively</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le43007-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Testing a New Resource Type</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z943901162lhj.html010064400016050000001000000113410717757014200151140ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Testing a New Resource Type</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="UP"
TITLE="Defining a New Resource Type"
HREF="le43007-parent.html"><LINK
REL="PREVIOUS"
TITLE="Using cluster_mgr With a Script"
HREF="z943900431lhj.html"><LINK
REL="NEXT"
TITLE="Testing Scripts"
HREF="le96600-parent.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z943900431lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 4. Defining a New Resource Type</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="le96600-parent.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="Z943901162LHJ"
>4.4. Testing a New Resource Type</A
></H1
><P
>After adding a new resource type, you should test it as follows:</P
><P
></P
><OL
TYPE="1"
><LI
><P
>Define a resource group that contains resources of the new
type. Ensure that the group contains all of the resources on which the new
resource type depends.</P
></LI
><LI
><P
>Bring the resource group online in the cluster using <B
CLASS="COMMAND"
>cluster_mgr</B
> or the GUI.</P
><P
>For example, using <B
CLASS="COMMAND"
>cluster_mgr</B
>:<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>admin online resource_group new_rg in cluster test_cluster</B
></TT
></PRE
></TD
></TR
></TABLE
></P
></LI
><LI
><P
>Check the status of the resource group using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> or GUI after a few minutes.</P
><P
>For example:<TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>cmgr&#62; <TT
CLASS="USERINPUT"
><B
>show status of resource_group new_rg in cluster test_cluster</B
></TT
>&#13;</PRE
></TD
></TR
></TABLE
></P
></LI
><LI
><P
>If the resource group has been made online successfully, you
will see output similar to the following: <TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>State: Online
Error: No error
Owner: node1</PRE
></TD
></TR
></TABLE
></P
></LI
><LI
><P
>If there are resource group errors, do the following:<P
></P
><UL
><LI
><P
>Check the <TT
CLASS="LITERAL"
>srmd</TT
> logs ( <TT
CLASS="FILENAME"
>/var/log/failsafe/srmd_<TT
CLASS="REPLACEABLE"
><I
>nodename</I
></TT
></TT
>) on the node on which the resource group
is online</P
></LI
><LI
><P
>Search for the string <TT
CLASS="LITERAL"
>ERROR</TT
> in the log
file. There should be an error message about a resource in the resource group.
The message also provides information about the action script that failed.
For example: <TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="90%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>Wed Nov 3 04:20:10.135 &#60;E ha_srmd srm 12127:1 sa_process_tasks.c:627&#62;
CI_FAILURE, ERROR: Action (exclusive) for resource (10.0.2.45) of type
(IP_address) failed with status (failed)
exclusive script failed for the resource 10.0.2.45 of resource type
IP_address. The status "failed"
indicates that the script returned an error.</PRE
></TD
></TR
></TABLE
></P
></LI
><LI
><P
>Check the script logs (<TT
CLASS="FILENAME"
>/var/log/failsafe/script_<TT
CLASS="REPLACEABLE"
><I
>nodename</I
></TT
></TT
> on the same node) for <TT
CLASS="LITERAL"
>IP_address</TT
> <TT
CLASS="LITERAL"
>exclusive</TT
> script errors.</P
></LI
><LI
><P
>After the fixing the problems in the action script, perform
an <TT
CLASS="LITERAL"
>offline_force</TT
> operation to clear the error. For example: <P
CLASS="LITERALLAYOUT"
>cmgr&#62;&nbsp;<TT
CLASS="USERINPUT"
><B
>admin offline_force resource_group new_rg in cluster test_cluster</B
></TT
></P
></P
></LI
></UL
></P
></LI
></OL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z943900431lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="le96600-parent.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Using <TT
CLASS="LITERAL"
>cluster_mgr</TT
> With a Script</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="le43007-parent.html"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Testing Scripts</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/z944252972lhj.html010064400016050000001000000077740717757024200151450ustar00gfergother00002640000003<HTML
><HEAD
><TITLE
>Using the SRM Script Library</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE="Linux FailSafe&#8482;  Programmer's
Guide"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Starting the FailSafe Manager"
HREF="z943897815lhj.html"><LINK
REL="NEXT"
TITLE="Linux FailSafe application interfaces"
HREF="x2568.html"></HEAD
><BODY
CLASS="APPENDIX"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>Linux FailSafe<SUP
>&#8482;</SUP
>  Programmer's
Guide</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="z943897815lhj.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2568.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="APPENDIX"
><H1
><A
NAME="Z944252972LHJ"
>Appendix B. Using the SRM Script Library</A
></H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
>B.1. <A
HREF="x2568.html"
>Linux FailSafe application interfaces</A
></DT
><DT
>B.2. <A
HREF="x2618.html"
>Set Global Definitions</A
></DT
><DD
><DL
><DT
>B.2.1. <A
HREF="x2618.html#AEN2630"
>Global Variable</A
></DT
><DT
>B.2.2. <A
HREF="x2618.html#AEN2642"
>Command Location  Variables</A
></DT
><DT
>B.2.3. <A
HREF="x2618.html#AEN2707"
>Database Location  Variables</A
></DT
><DT
>B.2.4. <A
HREF="x2618.html#AEN2719"
>Script Log Level Variables</A
></DT
><DT
>B.2.5. <A
HREF="x2618.html#AEN2735"
>Script Log Variables</A
></DT
><DT
>B.2.6. <A
HREF="x2618.html#AEN2757"
>Script Logging Command Variables</A
></DT
><DT
>B.2.7. <A
HREF="x2618.html#AEN2789"
>Script Error Value Variables</A
></DT
></DL
></DD
><DT
>B.3. <A
HREF="x2852.html"
>Check Arguments</A
></DT
><DT
>B.4. <A
HREF="x2876.html"
>Read an Input File</A
></DT
><DT
>B.5. <A
HREF="x2890.html"
>Execute a Command</A
></DT
><DT
>B.6. <A
HREF="x2912.html"
>Write Status for a Resource</A
></DT
><DT
>B.7. <A
HREF="x2932.html"
>Get the Value for a Field</A
></DT
><DT
>B.8. <A
HREF="x2946.html"
>Get the Value for Multiple Fields</A
></DT
><DT
>B.9. <A
HREF="x2955.html"
>Get Resource Information</A
></DT
><DT
>B.10. <A
HREF="x2982.html"
>Print Exclusivity Check Messages</A
></DT
></DL
></DIV
><P
>The <TT
CLASS="FILENAME"
>/usr/lib/failsafe/common_scripts/scriptlib</TT
>
file contains the library of environment variables (beginning with uppercase <TT
CLASS="LITERAL"
>HA_</TT
>) and functions (beginning with lowercase <TT
CLASS="LITERAL"
>ha_</TT
>)
available for use in your action scripts.  </P
><DIV
CLASS="NOTE"
><BLOCKQUOTE
CLASS="NOTE"
><P
><B
>Note: </B
>Do not change the contents of the <TT
CLASS="FILENAME"
>scriptlib</TT
> file.</P
></BLOCKQUOTE
></DIV
><P
>This chapter describes functions that perform the following tasks, using
samples from the <TT
CLASS="FILENAME"
>scriptlib</TT
> file:</P
><P
></P
><UL
><LI
><P
>Linux FailSafe application interfaces</P
></LI
><LI
><P
>Set global definitions</P
></LI
><LI
><P
>Check arguments</P
></LI
><LI
><P
>Read an input file</P
></LI
><LI
><P
>Execute a command</P
></LI
><LI
><P
>Write status for a resource</P
></LI
><LI
><P
>Get the value for a field</P
></LI
><LI
><P
>Get resource information</P
></LI
><LI
><P
>Print exclusivity check messages</P
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="z943897815lhj.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2568.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Starting the FailSafe Manager</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Linux FailSafe application interfaces</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>html/figures/004075500016050000001000000000000717757045100140065ustar00gfergother00002640000003html/figures/action.ai.gif010064400016050000001000000317220717757045000163430ustar00gfergother00002640000003GIF89a1྾̺mm̙fffffffffb993333,1@$dihlp,tmx|pH
$Crl:ШtJZجvzxL.znQ%{}"Iux#|%ȡı͜ʼ˸~zrywJqx
x#\#~q$ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
=ljA*]ʴӧPJJի-;:c†9hYD-K@Y	mK%v۶%ٚn]<20ߺt	5lدbEB&1`SʹϠ{jJ	bJxk
b˞-[‚۸7ͻ=caG$͜vQNzسkνK{T)=00;_u_nUYd
*V`ea6_YVf_ej!Ff	vWHDR,#3袍4ޘc540#:cHH
^x}9vFaO:&baJIb#Bi&¥HyEt{{I_}fTc~Ro3L֦*ꨟ:y)^(/8&6KFHl$^RMןu&g^m&[ixf^F[`.$_2	nzɬ
J(ʅWyKFYe+;y\lp&7]q:,Wl6A<ny& fisalc9ilDtkH'4OB_PG-nCS\wtz-d(rlPid/=Z:yM`H@~x8'۔
sHwB眇#ܬwR?^{O^^_;װ.GK{7˻ͷ_ϔ$ϸN~+NKݛ	zJvۯޭ`J>ۑ|]ї܉FY&AH AMn6ᛑ
̠g
)2û(D? ч(D	G&ρ8bUt(EUЉX EP`~P&.b` q)i:jpxJw=7Ώl]7#DƑsd<Z&{v8N2%0KML%*3i̙&DIe+';	JU2/4N0WzCD1׷FшTKr6_m5yiCpS2݄)v:@secKYr@c$7Nfӝτh"3_IPc
z=z=!Y2'@/)ЍVE͢F=ǎ(-I#OyM59!>[rYN'G.;UA	ӡ.t~#ԸXu'ɩNYΞ4U;ҩRu)XJֳa5beMZ&ֵi+\J)ucuͫ^y#׽L0K6Mb%-	b#KYNe3Yn]gCKڱMiSڍ^ͭnw6i
pKM.ZF:KZWTvK¤SOW,Upr׽#YO6V>9jg(B/[^~[&:="oh)0I:6_I
ox'p^ƦMVozO*_7l,9LG7JƻpBcEȿA2Ô7v\T*[Xβ.{``C"hN6pL7 DJ<Aoϥ@CjQgy D
E;t!C thF{೥*}ym1HяiXZXt1N_"5g[?dx&p]CIX{x-dՆmll6De`s:H
 #~ntη~{ñZ)<EY
6
g,~L~!>+3te6ًqK\\^y1>'kU2bNs`8/9w/?2w
)XұLeOxL8NT8z=?"y씞<>|
ǏsLXEP7p~4ui;.	0;nUyoBQ̂V~CdC97S(=L5Nx&dWP__/F%`t,rĒ@g	Y0y:χ?1&+X>9Y_^f4sɤ}h=VsKo=}_0KxW[y
;~urA0w
(B	()JG)8~k4L~uX1
tz$v#c}2z7%'/~"Â&hz"+~)x:N>J=BhI98F6EX]SLvI7K5yS#y?SxP=TLDUHk$N@LtQӄNX|PKKRhrX ^EEf	#T'Q`LUPUO#UtCd@dӇ~HBtsz4WȉOdhV`#HZxTTLT\D؉R[ӆqx(Ath<
#SGT
:$HCtV؈@ը؈N/ҸWԈhWUQ$,?(Qdi=(	9y7 "y*R)ip$I&ՒHÐ/␲TɔHEU>BeTY2V/1BP9l%ՔT	K6$xPQ-Ty[(@Txָcըt)v~9}	9*yI))y]9+yE	_94yY5	VٚxGYI`)%=0z)B)D*SSd)^-*w	i)_^A·+{b(Gy36I$638;VU4(/I?qQW!Jkա l7"Z&ZTs*zgqg2:4Z6z8n.j5>?vBZ@zFHJڤLNP:RZTzVXZڥ\^`:bZdzfhs@l:
t0rZtzvxzڧ|~:Zzڨ:ZzکZIz9ڪoJoeFqʣkF
Fo6hi@hFɠm!ͺnpzZ.

:mFnn
m
ʦi:lmik*Ư
گז
{Ŷnl0k몰;:Ƭ
j
0jzj
*n֮Zla5†4[K,K0{?[۳F0;;vl1[3[V[YQK8$!ja۠();l۶np+6^|۷~^;[{۸;[{빋[i;Yʕe&&:!r^,ˏvj{i
/ւ%3r_`1/!sQ^rQ.ZҼ%+˗	e0''D*'qX%zA~.)%b71CK%k%ҿ{sACGa[)<L)ܽ²Ls?gRq<t6!|#L²s
*0Zes(,sC{!(D|MIun|KWwtK<6-q;vdr xv 5|M}8.[7%GG}-9aۧr'+cYwH5SNx.%3wz/z!X+-W2(\}3~~,Y4sdAv1Ʈ'~ʲELG,G/.;--qۺӧze%B҄4$eIKe:>y$71;(g2|~-̻uww[tA'
r'g'{wj'S>͖!}is\_jvO:|`%?/" \],a"'ȟ":}&<s<$'y;HwJ>~ü;ppΫ|zk"5ϬמSmtw%(~LȘ|}	1)(sqj98,90ӝQҡ! X]
 B;섁=}[2y٘a1eҾw0ȧqw4i}+t<lzlɐl'5S٪:Cɳ-.k/|<
RҬ-%ÌmC-ٛƭIKs͌=߫X-ߖQܵ]z:ÇX$$MAD?nDyL:`D^i$iQnѪM5=dLኌ:g@yFl ^)у87*^L^Gax9\(KWy	4h\dNY
ZfNK,DU@>:@9t3䋓h9~BXy8&kޢ&;FT\lH΋rɇb.{<Q.qm>T۔[N'~弾unHFz1~:}nI>9]n)(7y=N蛉n.
D^)U	Oo[{)ؓ≔◾)T5Q>n~TA*?IuoD;'A㌨3咽I?<<oTG$Ug?iG_tXwXk?Um/ooOH7o8G?x:JnFH._xxIo3tsԐhK0.O^f/;aL0aNu}Xz|'pH
]NMOS?\2^81JY@е}㹾!h<"%'	-&%D"51-l29>Ỵ-_|-26:>BFJN<EeQYaemQz~."*XJe\q~&+/37bVnj5W[_cgkosw<OER{s-˫߿ӎw uj "L>q-Tr,F@{8#@rNRQ((6ol	9)I	b@FQ䱒#ƏIf& ̮g+Ni<!ڜHUɡmaȒBpG(ӨO	*Eͱw+1\CVQ1ʹ?YԱΞ?,zt(gINz5k%o-{6mѯ{έ{7o{.|8V#O|̟C.݆֯c]=;5o.~<yˣO^w>>Ϳ?!	Xx BhRX!rZa!#ؘ%M'آ3,F;f#4;ƣCf#G"9I2ds>$nNRYe$KZ=`_%cV)&g&hk٦osYw♧{٧gfYMOP6,jOMCeS`!iX&*
z3)Xh
>WඪU*NTTQî!Z>RarY+Rk2KMPJkˊْ+mB;IE-$`Pޚ/"TlK(Ko,z+:q/
0ʯ7{7mk+rD7J	; pK$D;."=2qn37/1?쫿){|
Qmbv2L
f.+hnBw9ctBhʶhvwrOi`3޸CS^cs޹矃裓^駣_2,SI.;О{?#3CS?csc/
磟߾[\߿/ h"0
\ B0 +hb0ܠ@2 	g*L!W2!
ghP!	z1B"h#"1J\"'B1R"h+b1S$o$
ah11h\71pH;1xܣ?1 IC2\d"ݥDJА[)Kb2$';O2>@odC,yJW
iҖ$.)K40k)S1-2͌e3s9g*dfill *gMNU@)KkJӛ6kzjS7Mޒ,5y~J?yC}S=Џb4}@:̌MJ3R1I9:ӎRTh89NB:G"N7}GjRhDϪtK
hJ
U:hDURUXwVڔd}ZAѰխp:ӫڕlg\׋?NT*5\llsūUT~ve`۪.Soel[y*`tMfW{Xٖ%-U
Ѯ֯y-]‚]pŦg hJɪDRۺU-y+XE*ֽ9-ox]>/xZ
[٪vem7	`:Juco]ϢF. 1M[_ցOlAu!ppx0v1Y-Nl~+L#crA
X$Ӹ1r,&/9Z2/OqTxz'
یC7r3l:zgaI7C#:ъ^4GC:Ғ4;Bu4.*Ӣve7SIÚF5ӤjS:C*5 -2Cf%@Mk'x
ca׹thI;ٲU!*iv5sYUÔ=ncC+Eںi+Јsۛ6[P
@0mj~wgOvl8s`qxsg$xkok6G¹slk#w"-f[nQ'7sg[Λ  80<.<IQa_04z(=p/o}<Cs8N[}6XU/h{=o+_y{-V8#n?"k|5x_=-zK/=wsz'=X߯˽%h]O>WZgo=ﵮ'E}<z|q(0ί7~߾^5޽̉nCRGMq|A՜a\ҕF(\E7[	zz>J!Q`6^ a**a͞=Y\]ɴx[[ՅM^ĝ4L`TJl[TEH]@E]OP!\xݾݵI!^nuae!qKݷ%]ñ`_`	A1+2bڝK!ĨM."Љ̲Kb!1Ba2*
:b0cPH5H]`5BZTc`#3[1N.J#3#4*0c$N;c-#t`9r;">b'"5(
d)
*"!@f/#= >b<c8^bEJ>F3c3L^7V
6v^|F=>M%=IcF>dD>2B:V[DG?rI0@)0!<#:ĭ2RPNb>2ePDd/"%GB"7aQL!7dK$_E <%Z-
X^OEr!eGJ.6N=f&/T$*bUk",ErHl &~8Si
Ud`BVW
_ <
N>!)JL*a+6$B&wNw~x	sg}&y2ɧ8h
l~EBg5t"4g	ec4:HR2~>
~LhN"M$AѨ=bѥx[^b$*rR5 n 'b;ݏ.#/6\xq|"gWOd8=fRcP#dhΥ[eh%fcb
cfAi,ʴZi"-)EEG2XviRdR.&R9F*Q⊡ڤEe2dX.阖e&j~&n&9mi>]z)jIX:~fMjcgJcjk*.H({piCnF}é2IZtbi*Zô@͕kr
ƜkPub,$*v:,q$Jl5ZUje,YfF\%)&ZN<䊾afH(\^
\b#hζi"$"
"^F۝~l*mJF
eri.kJm:v)*2-.Dl9xj*ڬ.*jɪiv-*b$[z6٢B$eymYvVF&hZ.^<⥢-q-zn|G.뚇t ynon3o".n2oB*,oR<ob$Lor]otoozɀ@ߨ||<FdЄooD"6mc
$
,0"6%Bh,6G$8Ts$:dpL	ChoBhDaSRD^t
!\0EH\VVV
_j^
ˡ`bHX_L3pL1*$[#K1U1gK00!0qp{&"0k;`13&o'B rz`22zۜ2*(ܯ,-r2,0s;r/w/#s2o3;33+s4s/43	35g4oI.rWZf< K6C.{2	;q&s6sy3ct0^C*1tq<=3D>#$!#0 ΁_D:D_q `2
pAt#tA=34u8tcHSE+L[0/q@4Bt!3eqo#_c
3V@O'4IK 3DӤDOrLL?F>#ӳ<+;&+B_(g5s8DP?JWI]5A7r__K\_0b3vcvv\'odKvRveecvj6/6lj6ov,g6acog9wA:&3 0[I/#vrS#A@ON1
66X@4E;rFv]T1%7CpoqqoJަs{c4Rı?{t4vjw/kEQd"x%R۴SO7Pt\w|Wr8WǡL_zt8uw	v{W3wo_KxvkXxm`xsx;#,Ux(csn8x3_lg	xJ*`txRs6,[?9g4z0S~Or3S7yMvLRsC7Y^z4'3K
fcpRdWy~o8c/s.۱C7y?[xcW(xsVXӹ#tywxX'xGFT:k:szz8z/4';FL;W{^8:7w{k}{纳;{IyHC/SWW4F'tKƸS_<4ǀG3
37sgtE_tW0R8XNS;;'aeS:aּR{5ͳzg?O_z@`{'p|r#'Yt/g=39W=󲽅==2}|{~1}/^~!~Kk3~.;x3Ho26g×?+<;6p>yϻ:d6;ȗCzȏ|M>sNs*{$da>R>}$9qO߼X:2}w}gC{җ?uw=DHbg:fi}K:
}L*̦	JԪjf_FM
P86VPv&(%w'9YxHvvIZjZIcy
+i؅x8˛@,<L\l|Tz+}
=-V;]n~>N6>O_o*0yę!70!:|1ĉ+Z$@ƍ
;1$TJNb&2,qG)3M8GCɡAP<IKk0kRQT)Dʘ4%KsbδkWv̪huӻv$V5:6qز/8/V1$<ܙtd/hʔ6ܣᒈVXc*@sl̟gӳF~=E+][~16BvqČ]n
~tн8w0'|C'~u|~y߁a	8 |`)!=	F/\a>HaLa"8$bcGc2""5.N7c:،<d(dFH.dQ(dRN	V^YdXnɥZv	f!~)ffGjXl	HnIgigz~MJh5ҋ.(66
iOc^i)fikliRꨦDʪ:ʩZꧯ[˦.[>˥NK%)JmZ{)XꪘRXΗ/m83p
bOc_|fa1[q~&g*.k2C3R8<i@DH/L?POT_Xo\=t
Mvfvjvn
wrMwvߍwzw~
xNxjK!؊⎧*㒿2!C]yoF
qpNz_9
z뜧NDPyH^:
+?<<7s=/[{KTP|oE;~$!1?Yzώb^W>-w`fp@mi'-P>PAO˂8J|S /)a+XPtD܃G
&PJL`qD(Pod(b/0*a w!3+6q><a=h!}3&d1sa!!B*ad=$$F>!- L1T!M.jy<SJ!1l #GDN7!hUCd$)ArR\RDeXVI#M:!)NR$)HzQŤ&`:3reF	l^0y	kSB7OnB
,1ń	1D1]LAaPsde)DCut 'uFJ˱Rz{;Hx-6CCD-Q3soLmS
ըJuT*zԬj5V
Ve$
Y:vrkkCָ&fˬ]׼u|_

v-a*vmcWce+j6ݬg;ϊ6iKӪ6]k[6mk6ݭo{Kڵ~b-qP*wmsJwWujwww.m{_z!}wx.+xn<K ;;[{빋[i;Yʕe&&:!html/figures/attrib.ai.gif010064400016050000001000000407550717757045000163610ustar00gfergother00002640000003GIF89a1྾̺mm̙̙fffffffffb993333,1@ %dihlp,tmx|pH
rl:ШtJZجvzxL.znQ%{}"Iux#|%ȡı͜ʼԳͺzrywJqx
H޿KW`B]J,Xo߹F&IBIɓ(S\ɲ˗0cʜI͛8sɳϟ@
2;]ʴӧPJJիX]uH%rhӲjDY
&E]kw^~Ip\\noJ˘3J+Ǝӥ^z5cL۸smsGŎxkOͼsἣKN<}{rh

+(.u	 V˟/;`KN<l_HX p
"`>(.&1a&!$Uء%z8"J_c}	_^sͦ
x#=HI'D`F
9e`]yc@8a7mK0xyޛQ@ߝL{t0j(栄jhV1W0fZ7Vj饘R'NicKFI)f7)y窜V@:*P%
wDsL]Ye`֐&ad+m\ٶf-\9lݖ+8FΚ-cȒJO"y[_eR*ؾnZVK*;1?bn;+#vO2`-kɕL{xrnys"tAt_ysRk	.KpA>П\$W#"Pjw-4hϟl'M^qaOtejKox!Ít猧	[~]%n;;c;o'_g*G;JogfVy
s[	>
VZHeB~U*/	G0pܮ`'H
Z̠7z GHB:0&c	)+|I
}HP8\X(EWQUbR@`.Cb^hEpeLcT0RjRH.Qn|\8 IBL"9H?VƑG ֪I̤&7J^ƓnʐqdyxIN\d))mmxk7ܴ2&,{bʰo\Mfy%u[%EKaZ4fTnҦ8ͩ6̜&?JgYTFsꔧ>=zʞħIhMBІ:D'QRͨF7QZ 
HGQI'
*FñAe:Ӛ7ͩMqS>%PjQT"8*RjӦ4*SJՃuQRԠt\m*WUJ5@-mKT(0E^W~
VKX浰M,GZ6ct3w׵
ͬfczgEҚ9lbֺlgKӟq+-+ގ淗g['
=s\vUtNup*
xKԮ+m|I^/u+r[_
50[`=}gz^|67Kvpd_OWu5TxLmgK}@M[cܸ,h&;P1[1,YvK.9r^RzhNCfy5L:ۙ9mΛc9π,=ʻͲF/1g:ҘtiS;eDV+|~Y5MR:x=G0%*M*Ըε/i1z;CtIbKOf7.Ύ-*hSfn{ΜMr{̴iù-zۛ|ǞN#z6?k[-I2[|c<H(OW<-8?H_QLut)'pz%'\ՕePxn(-%qLutǣkIgۗtSONU'@;LmMtd/m`T{H?^Swgv4ޒ{_6C=^L'{q*GOқOWֻ?@1Ͻw>i&E7LR0$~F?`#"ytx>6j?cϾaJ6d
}
8X@Ѐ
%x	`x{!|p58DXFxHJ wɦnWV3G,dCg28hTE&cxh]J!t"Ld2uTA?ci0Vq0`&`|xhyQ'xBc3>b"DC(*!"03`s|vBx5ˣe1_dl"o!'n(r:85qW>4"?D"7- :Cbɸ-RC׸!s#et]2JiKXBEasc9J'yC𸎮8762vwjms!or hh!䏈&e(&GuAB,9R$9#/Osfv,F?10刎rw:&IǎtEŸ$5ywDQ9R;39‘9~3]8#Q'{)T8OSkU9(\Vhq3P@x*>f5VE<>$9<6X?["4my+^zc*6%zy4v)7i>hC|oWx#>Iu#Y+cvĆ㕪#BTTRѡyn9D/t/-	.CEtD/b.2@.c	n9y4ع'ٝ6l(ym=ӅsFcImy*A/:EQfX:	0?F9EYnzf7;f|TgH!,Q-Aǒf'Y9*@1zm
MUf7CȍAD *@C8`jY3
1@ɒiH
TʤȔTh\]hpKqyPCGhOMkx6N|*Nt:W*S?trHԧ*L:ƏFdDt[rZnWԨ-҉
tI
F+7צZ#w	zuŪ;&j*ꫫ*zCfkwX^eT<5U`QҪXjWVUuP:XŭS:Hk 466cīX֬e%
VQT*XjWzSJ[:URů=EQSgկJV[V*XS{kPլ֘>;:Zz0ksZe䙧ڬEZȥbVb5uA\MEųK+]1KAʪlJ#4QZ[۵lFVif{s6WQ.a\f]uBb?g>bOh;jkl˲nKM$bA۸Z`KJz(@VUq8~ƹ[6:7[[{]K˺Y;{;;+B+[o[ۼtk$j{Rjؑ4Æ+kt^	1̺;f	5(TKjhʋ
yo\oc ln$m#\(,m',l+0O/4\G3\8F7<B@W!>QybąBėyyG*u2h٩K(L'|]b6RsWܤy7w'AxG$!un&rgaks\ڦeXLXJll<PNk;<,̇3{PȄɚɜɞ~@|:S`ʨlwʬ|ʮʰʲ˴<˶\˸|˺˼˾<\|ʜ̼<<ͣ@@ڜܼ<\|<\|=]ܜ
Axɠ= W}-4hP}')!]*|+Ր@p:|ЃC
.=~G1 	
'>M}+		P<"
}_=
P}`gd|nM
Q
]ma}~6=>	y?A̓{MGy0
Jmgcv]rg= ]S@/hf=
לWٝ}Mz֕qR-֯ҸڨMڡmt؉]pᰃum̭}؝=ё>cu}]=]}>^=ٳ+'(3Բ6.6O2BS<`(mHn%YV+(>>#6w>G~؋aEo"Nq>0ޕLEEjP"4:VDzD(P7mY舏Z%Njb>!Aix'жoHr8`Qԕ*ra1w~^Yx4DaAq%Z6X6aH|#D'8Di8 n%ò<K#":BJ"أ.>DHݸ'‰Z9)c/ْ:1sH9$34ә~.:RþqB'@[nk)B !۞ژC":^;"x
b>|0⣾Rh;#?NA/-;niB%m@
D(D?v%&.11dD`qAt?'&7IU-J䠌'Unsͮ<U܎/twyfy^gq1"BDK)vaϑcʏI3s8o-<`7vۏҏu (e8y8y[R;¡2(X(8`bګPN1l>5~{e	=wv$x0$B0BNZQ!dr:n!A
8ݑ}RU|o"Hb*F{)#;kN?77TGi
[N;vKS3u79s[G+&DU[N7IGb]xoeZH2>x&ijg#El̙wE4RsEOdSxuF̧I9g$ˋFPVDnܺ6޾iyҶ/f
tRƎC,_%k!L)f#fEeHz膝tm}_ҹ5έ{ʰfMCM~َ:L֍d=0!yqM.|;s0x{[;~={/~>'~P|"2(Y5RXaorء>#Xx+آ~ay/X7JcP
eY=a">☤:w_T0q_4%9\J%IFPΘW,2)HYTUsZ`eD	Z/Hm.daBJZNH)rک1&{	੩zHj
ҧ*ڠj͊+~N=2( ^ k
}ϒ^-rln~a[d>USU+%tilԂ쭹#n"<;}dhiX5m:_T(҉J%{i„"¥J5T|k{;QMLK3]-zO{ڀWc[sݵ_}uӸ5gkM$P
+يoP{ݷ^~W-އCCx]q}?N裓^Xq=Y觿E{
sӶN_<ᶿAXHWb+|
o<-ڃt0ϝ̭_==벜@<}Ͼߟc3	ķ+?7CYR{d8O	Khjܠw402aVŃ*65-BKP}C\"PDVJM"DFZܢxĺIM=ch31jL[71rBh;1VK_6jA" LH$#DR@$%+iKb2d"˦H>pr%)KiSz}"CJґ,OiKTv!(4C2Te0!KaL2%ygB33kLb\'LlF3&-9kV&8ͩNas|
y$:<%(l':m~\(4O3%AЋjҡU(:ЎZTlG1J\*ሟjb#Pe@iқ4N/9L*QjztlDŴ`<Xkjԫb5<*WSիH-.sw3ַ5r+]jW92A+	$m_V-lbKW~l[A毅"aIص1X8-eժv-l%KvZ`mn{{FtgU[k+675ct2՝]]WmՍp糵rV
/{ݸ7%xsS<c/}		P㦍{LFJ0{;`X.`Bqі-xĴ
q`طL8zǘB1d;J
J>H4'f^[9ZŒ%Scx[3lfu92_>_9|79[N3d|Vz3KهbcmCώ	t~ͳ_DC:Ғ~hwҚ4Xi\zb4Kmj::iPV+3}W:ҟK7X:ׅ^j]\7:.36z^]ct̞6j@[6^g%ۭmn撆^P A7]Qʸ[7]Y>*5Pʳ97F{4,uK[DŽv;q4<+<{ ߎ[-@|;7qr<pfZ'9u r@otyŧC*oznc=Z:׻=b;n=j_;=r;ݭt8zD~<O>'<#c>󹹼;y5=\8Oӣ~
O=[?л>goK`={/S>z?Gy;?x[?Ǿ6=c?Uճ6X,5{?rRAF	c` }z,pET<
 B@Vv`

dc4`_ , 

ڠ	@E,~qؑb胟$wY)lX	T̀ΘTO
4` a!I`uI.H
ྌ"EOLfSQC2
a
`	!t^}bz$"ex`(G$z.(*f,* "+:*v+͡/n0c11"c2*22c3:3Bc4J4Rc5Z5bc6j6rc7z7c88:T)9:c:c:c;c<<c==c>>c??
d@@dA"A*dB2B:dCBCJdDRDZ:>DE6B9zGdHHdIIdJ3#7‚+ALLdGBMdNNdOOeP
PeQQ"eR*R2eS:SBeTJePR:CF^VjeWrWzeXXeYYeZZe[:dL^~\e]]e^^e__f`
`faa"fb*b2`
VC0deʁdVffZfrfzfggfhhfiifjjfkkfllfmmfnn&o"o&@fC
UT*r2gs:sBgtJtRguZ$OcL%f{dObM$؁y$zҁQzZNRQ'OgOgzRPgy'Q'|'zh{({(w.L4{Bxv'|g|ggOZBhF(D(֧{*(zN茚L|h((M)h"i胺hާgzi>(:)(viRi)Ng
%JA%D|j
*Nir雎))"z>*)6jƩjjb)z*>*Bꪮh|r*.ii&R(hM
+rckkM*겺j^jj֪ZkjJ~k*ZjFkf+i:Ϊ
+kVhx+M鱲EqZqڥ`ibk*bzjf,Ǫ)ZlJVǶ*ʲ,llh˲*;lklZʬ~RgҨB.A
Rbfr-*rN>Ԃ(vrg^%z(yj'Ԋ>Ն-6hݪt*%dҢF&ۊ"n*2n:, ć`,erznnz>2d.,DAhcnnnc00"Ձ:&n#R/I/To*fz/]'>\INL}or`A^qB*bl	LƀompWHIMJb@)L
iĉ<WtӝoL	|MwFxnjL0+FpLXAgOD@4T0(I	mT1<Ŀ(𕸃JcDgL14XMO q03r#!So:"72#C/f%y$2h&;2$/Mr(~\RA)rtD#/]V+pr<qp,Oq-2`2o+co,&sg2t.3s6G/g3-wrd6.4iQ1ײ
_b
; vXs>@?ձT]Y I=r,t
s@+sn)#ó0[<wItJrgċ RHĔMS̵д4O	pMdOMwKPPWLON+P4@20<`6K!ZVcFmutEۄ7wjm^stKH4tb4KIOtc3USN05XvMeM@gs6sR7eighht[:Hv@HAFF!fV0lmvo@6	n^3w_;w``I3w|DOŝvONjwQhxfwĬfv|6?sG:~F_k/
71mt ^6BPqy((h8^vW`Su[s^γ@y'İvS+56fw4{6?w;{8Tt7,Emxpw
;<p/ӃRŃk7Gap3x_S|!(;"(\8t`kxa)4c;~>9SфS8soxt@W7x<ArFk6Eӯ 9<(@`S` @aacsz\y^W0
\Z:h{uKħ$aSz:I4Y?~(FEG8(~A{B9rK81:&	TpVs;1SmUsuZ4#EX?s4	5IX5/Y;{]7"VqZ	]M,W;s%Ikkl8vUGFxkxV7Ǽ2t$C˟<Л o=G5K(xyDѷJ6q5ds7rx783<u|btԃ}CM{A==l?yrLt:E!x=u<5xw;;W"uS}~bC<ﰑ'ÐU~J>m>OSأHL]58@$mp/1K*azSF*A{?!?(R9$pJw<D|APآf	%v*p"sXȭ*o_u0(tQpɤYcuw8h8&79S&8g9vCɷzyhhڙ'NJS‡LY+۳GZغEGVW݌yTU<US<t~./5N_L^aDWvCPBzkq?"E7.$}EJ'4ki-̆>\hDuә$3,␍RkO,r٬X3ҊJa܂ȓ*Vdr2ժn,?gR-KŦՙ)-6|}HON<0pn-Bl9J)HJ8s`Ko|f4҈"L94[{Iж<ҏ5yj}7̛;w:Z@S>
vsҼzYӯ׎?~`
.`>׀.H1]E_=9a"H"g`&ev#ЂPT(!H%ɋ(HQ:h
"肣Fx'WAi@]FuXc>eVNIfU	P;DU	\P֔p	ebX|	hR&yh
IS6JbV	^i9>9Oj:
j:!ʠujKd)ފ"k
l&k
l.*(lNK-RXmntךmKΪYnKвoދo֫o$Lp
lp
/L?q}9,q_l.q\ƥr&+L*o,3.KB@s2,{6vP/.24&P"5B=չSovked&jhz
vQM3#7\3,16o7/~6ZOxߚ 6Ǯŵڇky[>Oxt⒋aT4C^WxP~7:WKS{9\ons?sO>~~[=G&@ߏ
p,*plJpgY}dX6!,aH,FB	_/Mdbdg!C
q]A
k8B`LtAGD'N@QlB9,=x+"DD%Wd8EqocG8@E[0ϸ.up#Cu;%r^fǖFDqb'<Q{)Kg#6:M|Y%#FI7Z#9pUh$S9Tz2x\2hJ8^Q䅪6KU5ͥOnEx
s(x>'Iyg4ZyrviP\6T$,YPGkI(z̴cFP"DϛE*!1H
f.W%"eLc:$VPEc`wQ+OZ&LO*,?4&RUnIJEV
֨^PÊm}}"jZut]׼u|U
-aXhcJve/k'gVH-lYT2mk_vmoZҖG-V
w
os%״TŤUJwmrs]ewѭw[GZfyZP{{[JǷ֑ywu-~߭h)Y0kQm{jzI\':@xu焸NȔ,h9;ν({?w:e\c<*#mcdCpZd+&8N"te!#ԧܳnq[./G	%ϰL09P`apY0\\٫/kĕ1,?;ːKA[z߼i8w`z9Au1Rfus4Mk NrY>h^6
l8Svp'.֢̪{n#;e/﮷r?Nj31||p;l[
qQ{cft/x4D{|yU]L->_*09d^qt<}D/яUJo_~`^k}\׿}d/k}loۿ}tgC}9wnu~{+_xCWe^z9ϗ]/=Nzl^'{M{^E뻏}%_uʣS9	~H>k>ѧ~}o5}ԋ|o~_=/}7~??~_?2RR`uw]
Ȁ|~}uuzHvH{W
*(!Xw|V+>VfhfDX|778/{#GH}h}%KvMW ȂG~w8Xxu2b48%fheWyw?UGDXz_PhHxZXHȂyg'~'PFx(}jelng4<HVR^wxRGFX}׊ާx~czILjH~ȋXv8^O'{O|؈cWvL
JF|Gqvy	(}H|ȎuG%Ejfd`$`؎HgiØ\w胧fNG	tiWy!hIqp)+ɒ-/	1)3Iꖐif#5	A)CIEiGpG^E5IXU)V9pXYY\_pXɕb	e)pe֐;YOQ	U9pxP^&eWTIRiFz	YɗY5ri=VpI|Y	{9)Fyٚix3ٗIYy3ysY8	9w9)IY)byII)YI)rYnٜɝٚYɝ2	9Uu9yŘj]9YI.y:ⱟ(ןaIz
#J3۱.	G%:-1*)yڑ3;ʣ=j8 7Ju9EjG	
"ƷƞIJ0RjWK M
OڕG9EJЉej5\ÙQJ)$ʞjfʚ|hzj+
ZmzZ)
U:YoJ
%難Źc:ש.ɩo	빪:	ʨɜ
Jjzr0)JjGY*J
䪮ʮqJJje͡Lʯj$ !+ɱ	#+%' )˲3K4|"5˳=7K9 ;Ek3!AGO[YI+KMWRTV_{Z
\^g˳b
dfoj
lnwr[tvzK|~믂;+ۮk;[{ۛ;˧{oIXz%J:YjˡۋK9ֻk<^ʽ{[o&kˣE)!Až+˿3*jyq=ؖɭڿ,"
s")";p씿ٻqQxo!\Qث)|'(;X(ۉ*+FJ.$T&(G,]3\5QJ B<*[T[LNPeL^ V<Ub|)c 	q,sLulHZo|ljEls<ln	N<ʼƏL
Kbƛ|q~pL3sʩʭʱL2˵r˹˽L2ŌrʲL<Ռ|LLf2IrΪL<EsЩMq	ڱ

MC31ް
vp!M2%})"-
1M+519
;,?A-$ME
KMO
Q-SMUmWY[]_
a-cMemgikm-HG-Mu]X=Z<d}ÀGIW+3(G[؈=lׇٝm$
ݐFFCb=SqVF`(vmZ!y~!0|i-ƭMh0h])*6a`2;۴-QܝݵM"}-==q8UVh3&iJa1ڭ
pk>m$f5#Q]hA\
Z=Bv`g"cf".p](pN
6o5M_"3Ï]Q+;B<NBENGbe;!<]&Ma>jo2R9>y$>>loȄn`9^Ŝ>V>"N-n^Hٞ>^^^Nd]"-+Bp~ߔHBk*^ߣqÞN"PN ǎǧ{s˞kٮ%n}xMa~|K/Oo	
/Oo?ߡy!#/%O'o)+-/13/5O7o9;=?AC/EO+o֠KMrhQ/SOUoWY[]_a/cOeogikPsOuow?h{}/Oo/Oz;¥J5T|k{;html/figures/depend.ai.gif010064400016050000001000000442400717757045000163240ustar00gfergother00002640000003GIF89aX྾̺mm̙̙fffffffffb993333,X@ %dihlp,tmx|pH
rl:ШtJZجvzxL.znQ%{}"Iu#x~|%ƹ˴̰ѿħȢɕֻ䀂ӁzrywJq>H	Ç#HA|{]9q@ɓ(S\ɲ˗0cʜI͛8sɳϟ@
Jѣ,?6#ҧPJJիXjUxL8ZY%G@-&RK@ݓvջ2^w޸xELZ;n9r',Y%f~S٤̏7-iɢ_zqg]sm	ȰZR8{BȓHسkνw2iJ2畫=}˟W:|Q
'sH `-`f!T7fexڈub,b.⊷_#h24?8AIDd&idJBKTJ	3x#Hm:`[.dy"cJNF>"M:'ThBgw$Vyg:@4(QraA}Uu}TQZ%8MN֮+찿zSF!6쳺:ޢOq!}fZMP
d~{ޒۧݞ[hQ%++I;HYJ,YK''l0{fƥzkfXq8&gX`#wy2m&"{3hȱ&3.|3)I뜲gf~
)>Cpp
wݓ^
Wa0\rR12Z%Nw-.ݴwQ$5U[ojY;i=jYi]ǔfkjrmjjq}8>n/M{倽ޥ{.=nX':[Z|>ڊMޓ_TrjM6VQ)tv~;	%~%*UÙnU-j<jtȁpD#@fЃH
|| 3
i
gF5hdlŨ@qkt6	o2+\&P}SH.*
A*4=d^,V(36-!PIQ,x943AjԦ_!7`?9l$H)^;bE7#MefE#l6IJqryTc6<.M(QiJN)"06bSo<2fb'Ό4IM]`̦6ͤ\b8ǹLhN:<Iz̧>~
@N1'US=IVReDYZbE-wG	ҒSD>Q)gKCJҚδ"@wzt)BСʣ=MRԦ:BIToXͪVgUF.]4K8:(FŬ[MZLk]T't9=u{bFN굯~]b}X:JcDWeV#k̚vPgZ;cYàڏo$nOہ6no{Kng
ԧ:Ѝt:UT׸T.~\cmlMoRb*
opײRf0(}9y=E
[ΰ7{_0Z#FIwy01R^ܗCX%ɱw@L"HN&;PaV{
桕q^,"f0@f&e4ls|>yv泙LBЈNF;ѐ'MJ[zҹr5,ҭմ;<hA߹Υ34zp.h=̩w^L#ƞqf;ЎMj[خpd⥬T*w)unwMzͬnFfOe/yN[8&ϚGN縩<;K(gNXby]\q@e|;Eyo?XϺ5LrJܹ[~hNtN;67-p_vc};8[puϕG{|3Oқ>[kc%*oWzџ|]{GIOƯd*)<xC8ЏO[Ͼ{OO?_eLgϿYD8Xx
؀8Xx؁ Xt!vdt'h)hG,wwj0eC@#Bq3tRa׃4gJqZVJW;Ȅ#FFc[U>Q*GUEX#bB2VDEІnpr8tXvxxz]uQ8Xx8'Q!&Ј@x
H(Hxъ!
@Qa 00X
pp
Ӏ
͘Ǹ	h
ۨphЍ@☎X
@pxHxh؈(ɏAx/(y?ّ "	a(*Du^lKZQIH!xSZ9I7(@(,)Bac@M8X3' bM)^{4hUiȁ+68F>XGDK`5#Bҕ1ВÁe   b)fQ(I2/5m4?4dGYsEܓGs4-&5F.$ՙVXLbVE4GC_p;)Z#[CW$Q9XVWhL.Y1)#ll!rjax	ֹ)E'+0Apf,3X5X".Iz‰.YCeQD!XEJ?i*}>LDтEQ"I,:*JAzF*1GqcBڡIEA#B.Ԣvy@pB2ʚI3d$aA nT[@']?N3٤R_gE799CLC[TX1p'dEcE6*ES䚟HiF=ڦ=bę849سZ2r<csA*9@b<
[Z9_diO9m⥳S?5ry1sJFCCA*45=w4ds$[YDfzITRZL:Mzz*8JN
Zu	9ʣ#_*TZCES2
\bn{I3K:{:JDJ<ϓ3:t:z饩S<k
:͓K*=j~<ZKN듧:['467ݺڠDZ
d3(D#0={tH<tAHJHDJM;B56`{\r[v6t{z2|qy[%`۸TQ$QVuXrXT5VW_$.)ź#к%ź+S$8RkR!%'O;7%;P+*IP@S.%ѕʼN:ax!&b뷆;QAVweXɛW9[I_iZp!QY{3|6!IxB>F 
z**I&vZH?)$&|x2\`SVG/|g>ث㪭?|A^?N̸(8vzK
/7nObl^A̷k[e]<n09<;tv(<Ķ|~ǀȂ<Ȅ,fF0qL{Ǵkvfg'h}j6hfkFhng<Ʌ<ʤ\ʦ|ʖvEi˲\˶|˸\ʪ<<1<
\ag|\v\"n!"nnvlɬIWy\lqߜ=Go_|m|,=loTslx:}fм M(#%}w0M+-='835M%т9y6\Cp%(Nλ7tF|)LOO+*i\Mj^ei->]t=ΟK]z-J~}`}ׂM\=؆Y^;-h,,Y]jثUH-c}>Um{^١
}شXcQ#ۼ۾­ۊ
ɽx=]}֝ؽ=]}=]s=	t>^~
>^~ >"^$~&(I=2>4^6~4^&Yx]1%YHHȐi! 1UVYA!Wb9[؎Ɍ`͠F~txop.؉Oshh	y.^~蝘
p@i
nPJ>=~pkm0x@ϰĮΎ.ҨٌN	^꒮힞U>Np&I0gi8>_H@#_ "?$_&(*,.02?47_]<U;@oT"5
KZsK+89@CJ\͇n쓪D>s:Q4F'Wb>G
JJ::n_~Kga=4B=ѵnGCH/l
?l s=\IF/l?bɁ:B$ŗua}QhI\O0_H!Qڠf_a/OZ</oh9)o!ٮ	8Hi"<d\㹾4j*5$"%)9ӠPu(APp8h  (5[<D4Z
ż j(8<2VܰaJBrhj\@>֒ľBft*F.O66gnFCw>꾲ߎ뺚N9mY}emu}񑹴ci LpAdͨ6ibdYԦKilq4KUSt#T-\RgXfHH0eH(R+<t(˔RS+An9WʻR|8ĦN C̙}~Nsv0ᧅ<oI.1򔥔6{9JZzZzcPbNƛLA_,C3=loέ{7޾3D95j@.}:u}vrpvxϣO~==X;lȿSt;e,
נBg\[kr]m#Xs|`xh3X7
"hnơ?CYTxOBS6|Tb[r)*BiH!pLIg3H[2I$Ʃ7p:xc3~dTYeٚ۬Q1'dkfshF-bM bə,9*校RJ襚^3drs*:O٦6YFJͣ,&Y~F)().
{BET!AKaT|D)#R]Pm{ςDԚj蚄+ʛTl͎hLBQ뭸Nl.']RdVLX&1Ɋa+
xf(g\TpF\lqN"ArH4I5({R[S$F_]uRSmT	͵'Yشf
f[pi.m/Zs)uߏ=3}zFj2d39H6C
}Ǭ;n6pNz䴚Nv7Μڹ?v=\1u˧"7ɼS_3Vo3lΧoLJ:wB'j)lP]^4e4dsRUF[\fAl20;]thvJNZXbl٫_{+ˇ8ZDpK)9ĝ$.oJ-ZWvCm)TEzE
ml;=!|#1
octb8>FG٣ɈouBY
BDq#=UƏ:毵qL[O1lj4*WJD'ʄwM^	JˡIM_Kea9]ʘ\/Eʨ24{D҄7˻\rh\3ʁ9dRd^LqM@_FxJ4Yh*
U(g4I<@22Gh^hnr4")IgQ钗ԢDȁ.MFR9ӥ7-)Oy襴hD3I
WXS
hMT1]TKg-#G*DmRbOeIZJ+[*0\XmTZMmԠ.6u*nzFt<vv?.D,e+;Z6,@ς6YhKk&]-k[+!Һ6IM6mT7pS"7].sB7ҝ.uնC)v{ /yk7]/{7zv-NL|0L#8
/~VTڃܱԢ
|"Ǩ@"kX)F1yWؼ+g<^1./Uc?2u#!LI'qϡK&nAPRe+sXpc2eѬb6m>1go}5ɂ&owPh'OEl2:Ғ4+]Cӌl7}H[:Ԣ5ӆSUWgӰ5E*
AN0_"Vϭd|%ĽJ
*o9Z2-mh;Ӷvx@yHЈy+ɺ7\A6mmobMb;dn6J@2|m"v*84J68wpF'&BgDԖTZ:G<$XRry:Eew
Λ>G5CG+:=AHN#k=>#=$E
.#[7r;n:j/%Th&;xKm#}u(EDc>[y~uGy+iO[_Z¢T/^{LV8ϴ	xƦ~Nb=oߞGYn|c_A
Hn_$GcoM]_rO߈2  ^}P`Zb`jr`z``		`

` t`AI P \z`
a"a*2a<`𵚑j`@nV j!vf aaanJII ba!!"`ơ "Z%bb&j"	acMa`
&a)*b+bv"|mU]..b//c0
0VG
1
aH3:3Bc4J4Rc5Z5bc6j6rc7z7#4v1cA<Dlh>A;FkC=:F=c??d@
@dAN8NH9wC>ckcDcEDZFAzGdHH3"(Ra:Z$i<#FFdNNdOd`dd(	Q"eR*R2%@%bC6eUZUbeVS>HTR\QVXeYA"#:^%
RYe\\Z%W:W1%]e__]6^%`"fb*b>`a&cRfeZf_:f{@fNezgf]dN2dgfjjdff2	8$kfmf@z2mog4zifp"gr*_gzTrJtfsseoRvr'eZy`[Fgwgy*w
GxbXg{'\gp^{}je||f}hRoZg"hF&)hJhH2ho8jjvcƅ~{r舒5:MJevhhdΈ
AQ(`hB`菾>
V˒qߑh(rih<QiB'v隖ʈFijI6n	jB
*%:j5JEZUjezA~꨺Znzƃ`BȫWcͤ(5qSjL;=֚nSŰ"Y1Q+@tЏ"+)+qe?\ݧ#yv]5ַ"NAfԽ+ѫ٫k,i+50*6,0>lJ,)blqILp<tzlȂȊlɒɚlʢʪl˲˺lllll
mm:0m:B-rARmZbmjrmzׂm؊ؒmٚ٢mڪڲmۺNmmn
n"n*2n:BnJRnZA<Ez炮Cnnnnnnnnfή|ma*o2:oBJoRZobjorzoooooo.o/opp#p+3p;CpKfp"ms{pp		p

p0j{Ǝ
npqq;nvWoSjA[dq{{11떱q11쾱ñ1ױqr۱J1* qqG2S&_2 /g$c2'rC'׃&rr))r*r+r,%k2/r'r//r,{. X-+r3;s(#3-2.C33K3-.73*'3(W26Cr6*[s9_s7c1,Ӯ#n!w!3"kh01{0s8os4?>s@47423C0s?sC{27DZ'?49DrB_2?CE3t13;3F3B@3G2I4K;454EtJ4A4MBW:gt6.<g<=cpd3LO#LtMtI4IO7tNorVV4V4;1T/C״NruKZ30ϵ\ӵMJVN4_u_M6E]#vT/Ys"[.F>5Or-GwaB7v@7k_v2vj4h4kF6jvh6biwT4Mmomv`{pk3pR#AU7rbO:cd
fnSqx?2dwyxOyz7yw\w.v<O"Ww#{q(7xywug7w=7w[cxksxyWx#7>s}oFxxxxoo/b3#y+3y;CyK9m"ۃZDfj9rly{kcyysy/y~!ǃ}I
=(QT3-Wdݜs:H	V[Q)y:
V-_aA¨U\]UET#QQ":#>i0zckXպVUzGUW%8U-{+w6E,QʳS\Y*)#H{o;7_ F%GVu{/T%U{KT_U|;E{K}X!뺛:E_QDD;PzU\}d앭գ;_	{[z:Z΋:Pea|]Vο:;s{	>J$Ag}p}BtH}VSƷ_`ֻt}{=u=}PHۿA}৔W=<t6ֽ;>o=oߓGsޗǷ='kGcwK䓾?l>~Dý_}LZ~WT9}OtO{[?q=F'U,	͐~l}xCBG՝	L}z\P"AY䈢+[HKO~XeBb1w'ۛR5^ySu-[MpcPJuD(Uhhդ5)9IYII10P P`I`zJ  ! !`*pjJ,\j9wv|܅|\M=ݍmRun8d%-]=^ZiSVƟ4s4uإ{2LDy*JԱRrZS-Zj@K^<{c2CəAh0hHјio!lcaG[QԺU%I"*4i
4-niyt1ؾ5JQHr:r%bղe-
;~3/
dumB:Z)aV]nbDVwXF&Q?;
b;
'ÄIcL(E\Ӆ噵le0
SL/`)`\
>!r)HZQYJeȡvb|%uB_dBLg8R/(1 !?8
׎>NXc?

8'I)LB @KN?IfNfjfn	PTҒ$_r%"dfh.hjIP	R)闄Bi~
*P(Ec:j
k	B
R~njZjF|YtQEg H*kNKm7Z+":W;{筛nLZoKY)}g;!yۮyƅު>qljmRԿ$W	H#o?P.sV\!j1.ֲ>tl9b=tN?轑֬/m
Au^+Ѷvx5֤h jvNm3fovߍw7H]kz
x
wՃxXŋ?yWwOy+:ޝ\ԐG-[8nso{rn(ֱQڢAGؕ[sb>TsTCj|G6o v!{6>X}z4<o>\<A}ףF>=I/zAwO;9b]$[e4vQ뒷|*I`	3XpC  3!s./ [rp!LxD$a
EiXP,JzC/
E4]CDvBAdDVbqwsBБ.)|^QxFt*PIR8)}Q¤:ˎUFQrui9XBA>uaQFyAKQ;%IOvdA(@3zK9&B>Tq$:
n(:l0git̄WYGumf̩I1,9EssdU:GdR@0iO`ADӼW`pVdf?WWopGFY/!x-} jB|THEliJ-U_G8@|t/[^n|ڿ\:/PSz@dF1>1zjzw'Z:qH"h)CYL+1Hf!$kV]Eֵ4Y:^.b6ˮnuL__xGN>GӶ5ϙ9YǢOTI)c(A;O=TK7e	F$5ԑ_ʒ-_X*fi#Cю-aKlL JSFsq^h*poUDIS$.?76ͪn7M/6؝u'k8b7X(>A{؟\:l	\tbST0)uWbEOmIяyKJ
S]†TT~C+9dzjo~cSj
7Nfn;6#,wuk%tDwD{<уt-mtj]/ݵ׍ln_&>ϒzAW;v.<i
].њ&jim`pֲ^)}kfֆ-ð.㒥
d|#2֌,Wڭֶ-JzԮ
RLEuIrme-ipr݅iߢI՜KCx#3'{*\aՊ3"/L|Ly6sT'
-Vy`TlOd湊3dt[?nN'_IP~zfR9+tjK+7<W?|ju%]:u<?4܎^Nza	ϋf^ympkz҄sk'[nvV&}ʎ680)Dgv%N=:'ioS~wӟtq>;}mEKlJoO
-|tE.m=߻<7p)JSW&K*~}`+nFpo߶YkfjIv_U\Uapz%pW_ͦg~Ұ{SbG@[n6"xft7t,a3J`1OGtT=(C98HGzc]+&LDO~o~o'{D3pI8KLY@UMwYvTd+vU@du'(e*v>w@ҳcPwdPna<闂tW^Uꗅ Ȉ8!Hjyx{fq(g(c6(+QRUx:ȊHy牽w~Ԋz׊ X(lCa#UdwƵYw7<evUwGS_T{OAg莗H#jď(i<	(Ũ
V)	LYL-xɂQr I%y+i)i-,1I0)5ُ4i9I8=<A@
07GIKɔM=aII0(FyY[ɕ]_	a)cIeigik)Fy n9DYXɖuiwy{yp~r(X0By#tɗɘ阏yVI-a, 0K	@隌I"(rr,a2)2Mt)ZٚɜYɚyɝٝ\i[ֹ䉝ɗI#0X2,R02y0Bǀ⩜!)9^y
ꠡ96(	Yy(,ٛ雼Y-*jr Iij4:٠ʣ=I;*O9-)Y,,$
#,X*;J*9:餖	g*v]YskJ	zmJN4)xJjiɧJq	

z	*~:
@
꩟
*Jjʪꪦʩ***r
bʫ:a
NJZNƪ&"0
<3:ʚ&
0-.R.
:,⚥1Y-BY%呛ù00"	Y!:yK	kr؊&	۟ں)'#ۯ+0Dzۮ[+j*o*$NP0=kљK2`+8ʴOQKW8V[+:4*	a+cKekgik˶moq+sKukwy{˷}+J99N˵$O^*$*+{#KbH+¹+aRstҺ8Mϴغ56ջih?tQdօKUQNP}WeY&}	EļF/kCZMV]w}6}ᖆ{N({K7l{&u;L(og8+e4k˽9(&.R]H#,b)\'(.Z#2<[0|(8ë?܃QI|4S	Ȃ91JLUlWX3siN,*is-qfB2Rk{q| ǵxjsܸv2xNjJǧWhGBLfɟ|~s9ɨSAb\,1ʯd4R쨶oib|Ld0LZ\ˀZ<O<y\LZ!L|Ӷl¬^Ή͝+\/¬ǢlϦkeLk\-L
<l(\m	=·<ϟ+S
!-Ҭ#ҪZљ|'mģ1=95w,:-<ݑ@B
l3|KMM[PR}\VMX
Z]Y,cMemgid=>;/xlsMumwy{}
؁-؃M؅m؇؉؋؍؅2C/rm؃M4ٟ
ڡ-ڣMڥmڊ13>]swڧڲ=۴m۷۹ۻة
3Mԭ}yM"pumܮ]ۗ
ʝܳҍ׭]}ݼ
-Mu۬cT-]ۍ
mׯM
.l;bMM|}޿q]>-
*>*~]
!==l>JOQA%nEmL.N^R.cNMO/
Deoq>giNk^ռ{}~qǂ]چ8}Q
P6ꃾհB~X焎
/^ 
A*,.쿎
밎ɮ~n-NĮ^6~63^߾.N&l~ ^~~x~z^ծݮ$T|NlCm)+_!#h,O5o1N]3?Ao9;?Y~BKJI
m'IUoWOQyXaZ'^&/i6Oob2k/sm&oqO{nm}O&TokF>o葯&hiSoţ&/Kgţ\/NOO&/BϏ}oGrŸ??o7<
%o82 #Y'+ۺ/3]7;
 #2\2D9B-X4,#Ч^7<.}2>OT+UמaX_QZ]#d$%"f՗ Wfi&c*k+l̥i-&jg!/.l1r-3.(360r7xeTv6yggV׵9ж8}=Js<P4v7/„
W޿$Cz]*7rơlLlG*$WlHF)9Н̔p{'Pz1sڢiĦ(D)bC2ZiEEw+HS*Mݮ'jj-ܸ;Ʋ5dVur)/(sw
ZjjW0ȑ	7f`bIVV2Q)wNtYbfzK{~,5lY79,$R\lݛNLmph~3o_p&sr)s: _G6oG/~/f;'7Fy)gDt)`9AAML@(!Af~zB%fuxxbQ-"5 $裏,:b:(a2"h#M€#GxRV9bU$a؋W#@N-R'U[%ygP&e.rF9z
ǧ~b<vhdYFj%E
)Yڟ60
**:+z+++
;,W*{*!:-Z{eΎzb-#yv骻.dm}z.{/"Cꢙv/i/|0	+;0۰[|1R1{1J<2%l'2,21\3|3֜3=?=4ѬnI+4?G4Q4U[}-Tc5]_/^,ٿ.R6ں6۵om͚He|.KYަF'gޯn֢lRY̙ÇxVL坣6Ssi~8	I|:""_פNWcI&ǣ3Oc}ik~76AB
 j?./#ku!v.(oE_	X@+3]IH%d`13<(@Dt9GEPys  Ӊ 2E&ܐ,=F:毆V#1É2b?0R!(;5vODq};ZHIAN1xR,$")1?*u'IR$&3Mr$(C)Q<%*SU|%,c)KOl %.s/i%0)a<&2e2|&4)iRּ&6^:S38)p':ϩtsl'<)xs'>|s'@)Ѐt-(BЄ24ۤBR(F3%эr(HC*ґ&=)JSҕ.})Lc;html/figures/manager.ai.gif010064400016050000001000000643130717757045100165030ustar00gfergother00002640000003GIF89a྾̺mm̙̙ffffffb9933ff333,@`$dihlp,tmx|pEl:ШtJZجvzxL.z.	AdDG~O.}{"|sHvz#$%IuȊxpwwoӀNJM;(\ȰÇ#JHŋ3j8GCIɓ(S\ɲ˗-iB4rɳϟ@
JѣHJJիXjʵׯ`ÊKٳhӪ]3մs3
#ry)	"~UJP8uDUmBL˘3k[G
`&>p_UGݷgՁO;v٬QWI$Wܩ)2
9uO@wn1ËOqFXڰ'.@qϿzɵM	է6(}	(Vhᅛȍzҕ (5r,(uH4hRuL<UAL>B'J>W?Yd]'%-$CF9[j%_Nifcd͵clf)&i
%ve.d⹦tYgQ&^h7uU
<]:q饘v)~jZ7>h"H(HٟvU#WVr@=)PR:вJjONj|9֯Xۖkf۫s.&
W"޶KcXwG".mR0H~*1gXn]9$'tC,r)r!O(Iqp]s	VZAH+S7/uF4S编UՍ`f5z&mن-Յub[6wvl۵dZ-'qL-7oE+kǩ2Tؠ_n騧.!v4rsQqӌhM%{?qw}sźgR3]Eo36*Pֆji_6]f:c1-};
tӎp5-P~cR
 'x5Nbܕd1	n,!p$1	6
}H/
q/4ňxt˽6DpfiYrTFhL#4X6Sc:ԪESo߿ɉLD
HF"j$Fb2$7NZä(IIO򔨔"hH6K"*"ZfZj-`ILnvsk2'Җb	඼jFo%<r0f97fYYv2Hꌧ<=NwӘ<M-<y6h.TL^P4' 	FQ(o	EfYXvv8l9)!
lnsLQ̳h'T@el=37	(%̥0-S)A!T:UU"-zHǐzQS+Ƿ"kr\3R^&vMQƍSo䚜<tJy|&娚Nɂ,${ĝmlgXM1FSlz|7
pAX7'}E`("[c6[DN7<xq*qtm+\O4N#.vSӉ@3؜2艿/Q9yMİ2I03:(-}aodc,Q
=իz;^5k-k"Hy/9+GMʚT7ֶkZF<ǦV̐d&Z̥\.6X`c+Z!pKB~(cMvOɲPy[MZOdzihRng>gV
iVѧU3%ꮾHJ_UbC֦͂]S͛Sa;&)Qٕ(_6g{≶R8jRt3sQww^7Zmlb[V	[ފ'~F}?G+G'^^\lUn-HzJCXC\N؄xˀEylN8͜/uX-q~5B)kqA6z^MI~F>-)q4gI۹PTSY{Lt4<31Qg3|=|z+C熛p&C<h0G_qK]iem	≯egL82ooO
'F2lRϾi=Ay{?v{mzO?<bU\63O^K2D7$f16R0U=CKĀtq)GSDe0jCt5^jC7xf1jϷ25u"ysuwO~#l}:ezs}W>X]_WziCQ_cz|ƂƃLV@5T3LXTMZ.|[5_DT2s9US8G1\Xwg`sgUafx<`$L]x>NhpPxlRitDXDAjuƄB8O9X\fYwcehNEgDgqZ8&ws_t[2XvˆqHHHMi7wfe_ǗewxՌf\3s%Zoi<8s~)Ef~s%mQCE*uVU	ŏ~$Vbeh'oWd'FfGm'WM7Cv9ɘ4(	 "9GS),/.	6J29ԇ{,D=fgȳsx.rle0T\jcr4rKS8=d%hMrffMfE:z#ᏝDKyRcskIhRdTvvxBH_5y{9J5yyzy}VIm-1.;ؙCBHBYsU?EtԆB3lS>THࣕ阎w(@Õiz!*)DinIw9l*8O9	fޙJ٩ҘY8蜔'hCٞąꙏi>ƝT>ԟ:	&5asɠ Nѡ ":$Z&z(*,ڢ.02:4Z6z8:
قoB:DAQJ.z LRʢNP:+Z-ڣ0
WP"c:g#ejnڡpg:u:qNQb~z|zZ&oqjyt*hZ}*fڦmi:j
*jzꪎj"j+]>
Xª:Ɗz#jJPҚ=:,Ӛںڭz"z蚮꺮ڮ/ڣD:Zzگ
p԰[{
۰0萖@pQ
 p+PϠ+
`0
z@.P	Dk0
۴F@/;@	G*\;e;U;V{d+no۵,+t[}@ಁ`ؐAtѳ΀v[{KiHzQ{Xi!11!%K{K˺;CY~1]Ykh?˻Ak໺#t)rU|[![Luhiuٿ;^#iٕ::x@HXSLX(Nܘ]jk,f&x(xwSzG(gf9tf_Y´W~)D\Ve^&GyNT|3̨g׾;hA@<vTxfe9l9~TN
H[t@xNWyŀbTHC㄁>9iw	?$`eVB(_L&xlj-ȋˎuUl<5⒈=6+0]
eoUc_{frsv`aeo%Ԁ'SSUBQ`R
IHkyugnGnk
Zwx*8h\|SK|'-/6a3E5ry˚3>:~~̌#L]..=
 ldG&E=GEƐv)Ir|AZl?Oml,u}_b=!]r޶ճjR֋pr
ȿkAZICe8vss-|e?܁'vXL=Hzu?٠΢ݿy]EI)DlBIҲ}·M-'s)|jhc˩5V;feMUvG=A&b	idKw?6ԘIvn+.rȪx&;`9H(
{7͆M̶LpWؑ ngߛKz%}QS]nC
(*NG,G[-WR*a
HǔڰB)s0a-a̎ML|CǑ=Эw܆S6Y|uӅRJ1-+^^fEiȘ;Acug5mdWh#E~MxœYr7wǛ xdhyE^i)nv
OF(uHĮŰN~ep~^"N]Q.^_ƞx@G^ʾF)էfׇjh>)MۮKV=sHBaNnO·i|.NnoF,X_k=d4Rw7o=G}ނ"_>w3N޶><坱CXj5/v~fHdHvD4BHig(6|u,LZ,m;
QņVFUN7.>!-U>6_@lbsiUd8|o<wθ/U7Y^&U)K)6o>h'ZZsXyZvkLa܎K.'䍯l8"؏-~dJ^=~ 7~SnTt;$pXƵ}+ 	BqxBF`b-7
t1ljL)^INz
	"5*Z^b$BFFV.I:̤
:رƎE&-5#'+/KNSW[_cgkosw{.#)
;17A0("ƚk߭u{察E`//ʚj!-hV]Q*B,#LEPl←;"Iw>
4z"*)ӦNBz/xn t+׮hҢFM
?$*#N 	YK3Y(ǁ<20Uɔj`Wy
-z4gКiGZ*k
5TE*Jz8لmc1;rM(n]|<uQxM	[%F2	E}	_!
bYW K	N~
؝5N
<<a|Px@4ac7bQ\;<y!]="BSR)"'U$٥CdviXcgULV٦odӗwYXny"z|ڨBi~vhh40P"ԃR*P*8zCišiwPexʁg7q+a!!+`(zI++ةĒQ+.%xi㪉Kܬqj`rg+µohZujf.j305jAcANOk\';"E-5v3+e3sS*\y{n
Y!*].'tXѷKĴN{`oɹ؉Ӗk'&%F(ݷg=3[CQ6^嗇qUY!M+棓^z.k>	x8{oG.|3|Sm<T߽1xm_}?s~~5(/OD}GPK`X2+H}8hA
z!C}@LB~.D_Xf-
%va
u86	D6|O!XE$b1ܢ9E.n7T/щZt+RQq)"^s
C&ʑ}d !hBvP =>-$';Od(KiSoeD%+[JU2<%ǗX2%/{_3/kYs 3\gB3Ҝ&5ikb3&7o3'9is3l8/9wX31{3ܧ>3@JЃ4]BЇ:4D+JыZ4hD|*DE)9HjҒ*M)KWҖ2)MgjӚ:)OwӞB
*QjԢ"JM*SԦBJNMv3Z*Wկ5b+YիnUgJSؔ+0IWhuyFʺ̽z`MհUb͉n5+e+շzӣ!իbux\)X԰+j{(3ue-l]k#Hi[Vny[շ}p["׶|mnsk\R7.vkۮ֮,yN̬xVDo4WWFw!/;^Ҷڝd[&׿Nw`>xu.6ou׾kk_ؼ*^[ϺMW[M8:1{8v+{bcN_'C9Nl+c9Z2/9b3l39j^3f5SYq3_u3	5;wVx.
lC϶
B#:ҒͲG'"Q&iUzH}(Z6CaZtq ֧>mkȮESBK]U°}le/;^
j:3}Gd.Z=э^7r
m,P[vMokcުxXmV:Mp
+J[+j )l⶚MX<Ox%<fyr49nKz<ρn>}*ћ+QLǙpQ-WSJ3^̕ ɋ\aqoSkꮙ4>([pu*{M0_FwjB޵fGqg|V7L/	Á5#iİ2BPKNSP6`OEI-|زU|urCBŗ?/buW8֘?
?}o^R#/Ho#o%Z;ݔ5 @@ 	Q`	uUCЄ=Isqu\
5`ᡊ@EZP_,HD^]]h!n_>a؞'4c8aKw@
~Ij!4IA	kD!L
6F!C<uM
L^\ȡ"qNa_a`
>&襝T"]"}b*blpb`7`qaab+n]!D|]!Ky^֕Idp͚P4*JpaKD:tAl#ߠ/+ۜM(\I܆Ş5:
M`_?#[.*hL,@'$b):*
;QG"F0v"'R$`.jCJu`HHpdFF΅I 1^a^TR!VF>aC3dMv0
e2>H0Ɂ6]lp#.jaY㩘JNeUZqdK	Ne^^E\.]]e`b\%P`"faa&c_OD`e	cBfg^bN`eqhjfd#xbLzle	M&lhSȦ&\52i'&'p&۹L\T'u^neSfP&!ef`ungnc{VyNq_Hc`x(
o'<įzFgFDNg!%m08'g(ƌrIer&͈qn`j^ fg
$~uƦKh́tjߍ&V:ifchwf'QMZzd|hܒfAsh֟Q`H蕒j)WX~'|eې\x'f:bF@%J5(.NjIZ*} &jjΠdYJj	1`ª*:~**fb"vjAR|g
]#H"#<0 fa9zi֌Z>
묲	j(..HíBPĭG٥M.\Q6$4{%+CgN:+RƚRzrnb$孒FŢNB B̡FvfjzL%˾lk$͜KS',uFϲucZHwa[!~椷6$t2N]4pjm10iv,v_xju*Bh䑧=aeDچغ!9bZj!1>hm'~*2iJi6r.sm^fL舖i>nffN)rIFp.&vݪ̟,켺-o-C2ւ/.fkdΝ!-%捫OM]*ԼHT]BilbPp,HeqVUC0q,FM{.k&>&EBIobed"UM;'JLg:
ϖ1z2z^feQJdܞe腟WhdzmGk$Kh${ڎ]pLq;1J2iꮍhZ ߚ*
*#ϲ*^d)-9ZanC3-j.bz.>"dR̭fR)([s5kif_5?;.8Gq;(:cljq4>?J3>m3A?/qoI0eR3!]AN+3]_Pc#F3
VkM@vH˵MP3eM{G''nj()*irmDko"uގV&_#V*d{( X.;6mt0[%ϰ\GߣsHMb5c0[	07LuP(6uDS*[)6al`*J;ONR:@,BQ Z0pzJs4e?fomH˶N"MrNx
l&2Mt
{#'Ν.322hraCF4ؾVRIj,Vnk!1g!6mh6R6[3Z-z3vj4>N1O; L6H77d(4}sE	R7N]1tK;+
7m^K2
^)S38fn7vRm[7Wx=3Qx8eO/&5Ry_D/6r4y
`8x*y+ݱoL6	BJ~@},3D6o_'뮎"zeW={6tq%;[﯇߱;N:foKhb2!gBԒu?wqWzڷzCa[/.bi2/m"x-_-tzf'&$[1"w.{Ս.fzP<#xx9&w@.bE(~*38vA3|[L-BGwfȴ42O)7_38&ttH%276R=0w4G+ar#6|upgq77&{
*Fk(h8n5qiy߲|@>m۹{j}epb$geF3ok;?vz}m_o̿O^C·	[2L3ΘתAep]B**~v:]u/?cO>sv!w%|[J$V^~{ϳ>Ϸ#3m>$O~wwX~LC[j|+G:Z;On	>'1<ߧQ:r<jya]h'E㉦꺚@Ɏ05ڽbB$%,I@.%@X,{h<`n6ҕW7wv0DT#Tbɳ9ら2s2کRdIS$ê$j2
yj*3k[Y;[z:y|B
-m	];}\*
@%E~f/?8	IٲJ
VTZRkU`	;`d{
!R"Yy
?%1rg68qYYr˼D=P=I|
5ԩTliU*Vd8sl
ۓ(="4ڵl]
iع?R]P>뛬6
fƤ_#;N1ɔ+[}uE
@ϤCk;)iaئeϾdbW(W.RƖ{navںexd,/{^f|Vs?oZ^yR᧢{
v{dC~ɱ |ZrW|QeWV9^"=sW*؊.c2cr":8xdBIdF&QOgFN>	eRNIeV^eZneR2b"y$8G҇_{&wfQVcz"#twVaٗR6!7hh,xiEZC`G8hvވ瞲NA\K	E**+PM/ϱRқ!FѮCغtUlr-jKKFlk}E'vcikwK9uWG+0gv`i1gmȨI{]ji"G\7mNqzɜi5[Ξ
Fͤsl9k[sҞZͧ=q'+//p>*쩮4US^ȳZ7-s_M\ױ];v;-c
EfOx
4q눘އAo{{{d?n !8RNɽo}bFџ|3z//}.Zwtg&	p^{`G*#\
j1P<Z#O66 DöP4
qwP
 );,"zx+!*qLtš̰\0QDz5'q۞DDV*.OkD|1kQ{Z`S3##LFh?  J۟P!SV"
\? !*kg$;Xᄲ4#'N()TFM~1$7Ti33f.lRHUӴ5LI@yps77	N`l;Ofs6s["	X'T)NRVI
lC;0C/QQLgF?
RF4^@-ҔTw5i=Ҙ4H-uA2b9Uع+jSPZQ`5)Z`4$m,YRM.Uҕe!UfM:[.*)$qG’:ՈPU	 Prm7Wj6*?IdUFV{U Lg/!$miwZvVqk[vݰm[[
w=o#\*w(0q\J};궺ֽJrR*#ot|߇ҷbn~+wD)npkIֿ0F,0!3@
wx0+aX&>qD3.y'+|&걏 yD.$+yLn(KyT,kp&q0yd.ό4ylnF	nLgf|s%>DB7\
9#a(4=m"KˊV41=i,s҈r!Qz~2\kRA^ul%3rkZfGiPG;BliϚֹllջFrmtwzݮvp[Y~Y۾-~ӛ.8sޙv7p#;V{#7Sޞ7G>?[ٔVxX'yWXsqV<3vws'4g:kV'nnqXA]@[
b/nco{wonz^wߛ'М3+~oK~򔯼/y(?o>/Oѣ~zNR~o2^ι?֏+oKԯk/eLa=a-X?߿'Hh	Ȁ
(HhHlޗ!(#H%h')+Ȃ~>A@!3H5`9;ȃ=?A(CHEhGIKȄMOQ(GLUex[]ȅ_ac(eHghikm2xSsHuhwy{ȇ}(HhȈ.<AdQZwȉ艝(HhȊ芭(HhȋhQЋ/X$`SȌ(HȈA(2x2r@>XXP阃ȃhȄ؃hCxB؏MD	H۸#HxT?Ȑ;hhɍ I)##숒Ȓ((3ɑ'I!I6Ei>y.yJ5H%y@y/<YX> 0y]917ٓ@ii5))iUXpY$ɓ~B)qɖNi9|Ywi8Wy$=x+Yyb	x	ٖPYFy)Yy)y)I	)٩<`Yɍac)ٍ7I闿iٞyiiٓI9
z
5؝>_Iy9rhș*Y#8^ᙞd)*Vi9
'<?:+
-/gAQ:(@O
Q*SZM9H
aʆc*eJgjikmآ\ujy{ʧ}
*J8ujW5]?z
*JjxOIĨ{F:f@4'pzJC;٪j_pEA_
=
8&ʬ=J"j^֊9ΚꭍJ+1GE1fq:	]Sﰯj"8H	+#󊮈0[	;	T
l{T5!KEQ
^˭^20[1K6z+5;8˯Dk<k/k0Fs3r,)@	Z*R,[.ۯ=;;_`;b^ja>;`2[ʴ*!UPķR+5X^Z^t{m{E۸pKD˶@[B۶s8_P>ķ}ECG⮣)z-Kur˻q[ۻ+[;DS!cBbR[빜+K뾕[򻾋ۼ%'TXQŽ׭궝{y[gr
lQI,$kLND ',%®r
ʱ/l013<;7S(&¦IM1lE,",̮J,@0n;[[LW`J\LGP`ƩeT)ŔSGUdR[DWN9z{W{XYqqaG@31M-2.P@3$1Q1S.4\L&+.ܮx$2UjŲ!H66fHUgIlY
6LͿN~KT*bdL}TG8,uL&5o,5|1l1]HyZ VְϊT_uL73<HdEΠUIAsUXFͻQL)C:C:>4CV,ґXSI ѱd2Л%*߲͚UoqV,,КБ8}9@\#0:P=#mY?D:ƅL3r0->k"Պ`?#;3;#:?!TLԁ<BrTMVlnj>w:ts>=ّ>|-؝=9|p9kP:><s:ڎ}Ȟ(cWاP۴MӃ<q
/Q-C.[&<b) #݉MۍBhW-ܪ
לaŁ-:V(la,G.B-u	ݮƢPN)߀+]
-EM6UL%~5ƤK)Y̘8vU8(ձZX&MI=$^-Kbl!T,-1-Ք*+YN.Kݼ:CWN	?}GǗϨHmMSnFjUԊ2#3^?CLUNUCPL/-r4
Ҭɜ,K,!tD
=d$Ib-ػ2 j/R]BnE黭۰o.ϴ۶~-_=se>J%Zحk<3潮^M̑:]rV˩ˢ04~Pe ztʅ4&MUL,5~DHTn.U@M!hLlVO_~}HK>$^6aKrIɏ\nIP=܌zL?-7_|"@a4Ta}[n?	o /{VUR?<9-(EALcɜ7ٜJ.-RCE #ֺN$%_x
Q}M%W&p>Ƈذnl?Z3Fj/lEN\I+;q߯Iӫ>ʝL.,G/l6$&.0_4(6nj/尿\O[5 @4fYc۞b7;'#2\2NM  Pt ,/8,3:^0vX]I)MϋР!Oω c Mc%$MߦceaS*kRTU.o/oݜޫޡRPq3t4ukW-.p8yyܰ]t'ju<}=Q,7ms,H1c2l!Ĉm[@7r.]uG,i$zi]#̘2 L0%Μ:wĹ-g-j97{2m)TlQY
(֬j+ذOV'ִj R,ܸrNZF A
2^;Rt3n	Y.2`b;fۂ\4Ԍ#<+2[άs۰EoMP1›1vT'ÜTKx8ގ!eiu(9Ϲu=[mεݛ[CϹsIvBg`uWp"H`=(݄&X 9߅.2&8١( X18>eU{ǣ@
ގQbH`	.$)Fi ̸ [B(&Tr)%Ha&c%
hve
Wk5F}6_m{>v	i6wb^:v\ߦ^J	!u.e;%9%S9ꨫZw
y
<<団GHj+vh)v-K"(
>;"QbȬ|T
-Xkigj(Wn;iR-n+,6;pi,4J3q.$1
̀`@!['S,[de+܆|nj-A==OqñcK+jPϼU[}u+F˼WZ|?z=6iJ6M$íV9-7-y9ف&΅[h_^[([a$zi{{}:l]6ꦣ8|*~'U2t͉!+*ˉ;/Fۍu|d959S?J-j&?ċ3j(/oK>V>!+np2N|Sce93A<5~ V@m&dCBJ0Y'|!QP֋!sְl`t(!Z><nH%2 RV"I
xR1_ZJ>F0Rn|(Tr!5)nؒC(7rrȝ
ũSۈ$i:c*GbKE;'k"zO_ĄHF^08DJBaG+Xn^^*xIKbZ["C$"	TfLvQ܃3iE[ޒcN1-VΊf1Q?iܤ	Mw	d:Y-z|_>x=(BЅ2}(D#*щ"ԥT&ʵTug??)k˟RӓY
fJaxHts\`!i	r!(±FO*+:DT*'vѪHVÚêz|X+ZKHֲi}Vv%\Z,޵˫^TW6o
FBpZg+б2$DŽ<SYx|gՉw.kR쏌`[tҏއRi[Or;!>MrZ
%/'Qʕ=rO*M65Q,\{j7k\ŘjEn!NN{jҧKtvg2'QK^"%uiwwosҙw	
FHޖwy'_+
۹&%0B@RK߀3o?Q"tխ!}88!"1*{yLcJnlP?G'}A*Sh0|/Vb-,o=+Ґі>QG"'QPӅ[*I5}3<Z7&3iS]ͺ&ۦM2Zw4XHjMzz-vFsfs<΅a{43hXS$=$۠ܩsnb{Ɋ;58Kc޸oVdGy.]Ő6Z#݄6:XSF=4mMK2q=Ut7Eck+Xĵ{^v\l"+2-f']iRyn?,ܐ+ULdU&mPXN}M?1w<hJ_QlM	61>lghߵ6t;r]:f)dM^WN֎R5pJxTΞ+oJ.졵yU[|[[e|tq.uwߑI7B|S.Џs_,>AGɯ~^7/K_iHԟRVs) Q^<8hiUʹ=P`O	I9-3o1o}jX
ΡT\q\vluI$G~\X%QCre
RrK_N!X<u5S!^Ta⩝"X%9FZZQ`]. mŘeO"F:#ΝK-
Wޘޱaʍ^^;9uJ錒5 |F/`~Dbc95R̉2#V1
25KLoiv^\#vUe)#bk$b5ZB 	X]Wd@¢ 
 a!
_=棏Lr<
 G6
e$CuIGZd9l(*=p%$Cō }=#=lCd̀KdCXlIך0!` Pl!ʑRS'Rkqex!Ly2bR,\wY*5+B~F6-UbU!쁝dXeԩa4^6!~&~cbJw&!)a)TcܑA$k#j.(\l&=YV%o&gq"ۥbG1!gg68玕"Uj#i>9[J-j⒭gLTM]鉞42M!2f›g8TMga'ە!>c2=&g!h]!A"䰩mg52I.V_yI>N{F܌
ۡ[[]zrjڦ[kJfM-ffDtQATdJ)nfMwo^aNNO)"C6%`\e@ס^˥%q
m&`VVo]Fjr]ȥj*wIV nJ֖bܙ"b&Npb]کezj⪭n&eI2p&uuDj4r*Q'&r6(uQcYgB'2 gjpa
&OL+gR2^)
ަjԉu#j\ײJ(7ٵX
,b+}e`0SvkDk)Л\NjP8ɾElѸ,~Nm9i:n#F'&-M+[Q<EԂ5v$vmQma~؎_vm|r}V`xZiLxFM3(ġDie(>n*-Z'$cxhynnkТ,..:uB'
,֮l8D
kh沧f"Ĭ&/Hmn6/F]/_z-*/
miԺ$j&-/ϢB?2NaNWD)P~+4
:ħdjƛBl*i5ЮW	*ɝ Ĥ`
rbŒB1##:*\ ]z~0qYbyH!5=%+6o;FO(.h]J΅kMn,
]kk`v':,qѢV+~AmJc<z ]F oҾd{W &U``WzÕ˥PwV'&^]vӂQrn'y[	sFmNz#;ˀkYplsN%Mj؞%ci.Xښp,'rإQ.&3i!"2I=2:ʲ.ǁr<SXs4D$pׯ>-l.NkRYbmcdޝF$eDϺ/?[uqjqY*q

Jj2=wM7!s04 tLL\e.!XV"73+t/o,BO P܆,z&4>F+#Y}r[g,(㓜mY^!G/V-rX.הL)g)TH7\',S_kfKagtuz1cfvbkikzb36v
ŧtY*E",_+gvݥv%]w5l۪qh
J~V^IoJ׬n:co("=tNt	3ꚶp<4/dU}wMwp~o7?Cx)StW浝'PvFa4l烙Y008ܽT_X1ph64 
~8^ǡquo_`6N笊&GFBV]iǩP-][&9+1xj5okW:goFhx;Yf2dԠKQ:8ytnyWy,P14K&4>8"Q,g㖺Hg:ke8AȚ:o_^oF"!:.Nkc$'h5x[-܏J1dco/*0eLuJ3E:a9(v.I٬EN	x',ߩwMm
'LYI
pxN[u{8;e:bs{/;s\"!t<$SH}[q9R27r1ryT-e(s29Sig<i-z&`Fmqd|C X:taXF_/G9ֵLՇHC>D.Kl<H|#1%[21k}:2ur/<9jx4a"ݺKĈ4f|5z
{pMzzR{z4P"??GyOyjfַHk'?|TO\s?kɾnr|P_U<'S QIXF#˷0ZGHQtɄ'*!Yh=ys*Xag]SrpB%ݾ ,
sp<>cPnf>Qq7^l_l5n`[0MbaѾqڛuw~z|~藕TkXBPIT+j
+Bz6ATQ
Hr7oxî˗0cNz)Ӧ7f	4h%3@#3#mD^P[0+x
|	I?u\hI'&9xk<yoLa+^̸ǐ#C-ݕj%xKM4(ӨS^ͺubseٹ31麷N<0lpggͼ5C.Nس[?nYv}ooM\.>,kfϩ{k_Xo*)6 Mѡ^b4AgPaa:VPQeq[I#aT /g!b^Qc|RYx"N@/HE`r-GޒLBbM9H
1OYK{̗T6ŕGYT%b[UV^}QN^
j^HhGzwWt	N7u5z9sLI@R	<Ȅ>-6JrNjHYZu%)謴
th&8UXūXe&kdɘP+km~+>vKPYJy7M+[jo`蚺k0yb+`
p[Z3,rsB(|!r~7̝% 8+'@kV2USdaRft&zhN}2L6/Lc|SdiO$`\dcX`1H/(vLA{}[ԠQCsQW"2J~-yKC+\[&j
n`%Fc٫Yi%X#{=w۩C@ո伻c嵠b꟎/Ck~g޲N7C/=R蒽l{sw"9m*ճ远|/h
bVFL4mPy L @0'D
#aB@+&c `f
Gh$@b5A:PbX<x%Ј.\a
1FD h3C)pH+bY"BA04QDDd"hBd7bHJZt80 	Ad<!ΨJFtNG)M,p/Kʤ 6IPvqTc2]BqLcI&5t3U'%*0!DcF<`6uMZDM<癚q󞃸E&6Ou =JPL
3XІ:e(@	b3ZLю6B=JҒ!-_FMҖ)H]JӚ1JmӞ>e	PrjљH'PcCѮWRJ@3jUW-ujBjjw9AR5E-{%	%C*Ԋ|;Y
˖Ac5fAd$ AF~kCh)6!0iP[0#AC42DMadNuGZBKc_Ov/Lxe=VhM7~3^l+:Ji󣻍Y[}S>p*wYe\uJ5WRZK.\56\nr;?G–}=K	FD|ZH?Yl-dIu"WkV#ֽ3ri1yrl\ȴ0MI,se,*`N	Sf3Jkf73	͊^Ԥ7>vF\
8E5iKF_Ёf#?ev^73HGd~/];aKUNֈOͼ B75OոƎ]}8>5kg`ۦ6g|}f4ڤij~NlnKM;`6ns`ոMo_;/av-{r]ꦶg#h"NJNq^}Q^0qib4c
q
ŗY}<'ܐne#w־rEtGܩ#%mu/X$*+Rkسگk]>')O_oepw@k-پvb]QὟىWoCgOE=p^_W&j^l #c쓂r؆k<w_ĮG/y./|'ڠꓼ%F[ ˿:[?q~_e!g,QuW}gkQ
8X3GX x a(mW"NQ/VV&8릂4xX:(7 @^,Tu09J8dCT/xzK8у	T%a(Zq`XDPglXb8d؆frXtX~qx_g|~X}{T888zJ؈{uX;x#Gxp4o"񆊮n8X&Hm؋
660ʸ،8Xxؘڸ؍8֘wGu!
-XX8Xx؏9Yy
ɎD39YyّN8I$Y&yHu(,ْ̨.2098 	V"s>ٓa@Y)@FȔ.)PZ	[(X	dy1dH8^YpbqY\9v8zȖEkY	iq󨘃ɘɘُ	9ɗY阔ٙY陋yiy%Y~9U!)0Iu	éƉ	˙	gIЙY9ޙ)YyډIYٜ)ٝɛٟXy%V
))J9
Iɡ
#ə$ʢ%
'*	)-ڡɛ+4
?3ʟ"
5:6*
ߡu ɓɝI&ڝKFɢdڛP.Z-d_
ɤgdvzYxr٥~
 \ʥOښ]9ɎW*mi!nhʧG=ڤmʣڣ٪I*Zjj@ʪj::zDڨZʫ
Z0Ɗ5ݪ9	*F*ɝz߉ja)*J튯jHxj{9zI ["T92%;`Y6kRD;8[LyH{+˴;K;TJ{PK.0+HuFf+Z۶nprۙ/s{xzQ˷;~˶v;[{۹;[{ۺku!;[{ۻ;[{ʛ̻ۼ;[{ڛk!
;~ Q{蛾껾۾;[{Pۿ\k1
u<\| "<$\&|(##!;rV˩ˢ04~Pe ztʅ4&MUL,5~DHTn.U@M!hLlVO_~}HK>$^6aKrIɏ\nIP=܌zL?-7_|"@a4Ta}[n?	o /{VUR?<9-(EALcɜ7ٜJ.-RCE #ֺN$%_x
Q}M%W&p>Ƈذnl?Z3Fj/lEhtml/figures/monitor.gif010064400016050000001000000032540717757045100161650ustar00gfergother00002640000003GIF87a},}(0I8ͻ`(dihlp,tmx|pH,Ȥrl:ШtJZجvzఘnk{NG~o7|'}wg|[mQHû>9ɐ6t2.*ё&ΟA\C		0E
)jTwcCHRH(S\dʔ,Q%?bNMtU8L.RNJt$"0SlZäQo
ԭaq;U%آG;FDw5t0_oR۬Ø}+}2	̖zdA/4u50WBV
I;mjruΞ-8貥7.'7tog쨤gqs_>xTtig~MmcۂȞ`9dW썰Xⅽy8mx"n
$h>Ȏ99[8HV @"@5BG"i!#@M$;
lg4feD
_LIujdM	s
6%řa:ygKrc{5x$R~yO="|_\jrکL]A]Vϩ&+D^Skb5&ǮlESڸݞM	h.A,ջCkdnkhƺ&rm'󢊛	.x0bgEkVj/YK6ւF[/7;%fHf<|DC4\]?8je&!QCn)j4*΀ 7V]&\l'Y]e'GC"5q
`=5\Xvۅ	wzg!w۾%709~ݾmIu.u2\-t{o4T? \zV_*43*뚼{ia7&>f߼^K-b}f߳٥Ëk8|l4ޕ@#c69EӼgq1ΣqI1WNW
\V<
)	bĺ@՞}~[V~IPPzS<3
xn7Ѱl,9ft
B(q~WC((QY?P}3JU+(d#BR>Mi.{XnG:qFT(< 
1znIڏ,HdH"	Q@C(c`4l^Z%*x>UrCLUnK5¤1$r,FB+¤1+
/VFFBLU=\sɂa&R}S21÷?"&3!Т.Yp]>Y~J+`[$W~hˤfD9vhGFGTͲ'6B\t4},ɜ#8AGē3*RdV9%fsjq.*U<XͪVծz`
XJֲhM+);html/figures/n.plus.2.configuration.gif010064400016050000001000000477430717757045100207360ustar00gfergother00002640000003GIF87a7<̼.ޡDjHꙙP(k-+孛J~pڅKЁIb}}}{{{㦒yyy;wwwZnuuueBHо^A:u跧%QҌaaa___,z]]]*^9I[[[cYYYWWWUUUSSS6qQQQ0(xc֒o8???===;;;999H777`֛555333>w111///---'䫘Nщ-NeנA|53~ʺ-\SҪĶj؂C!s떖gؒ7	؅jqĈ44Sޘ>y_W0:UӐttt1}lrrrpppsSnnnlll[5jjjhhhfffdddbbbh)ClJZԕy[PPP1NNNiوmLLLJJJ꾯HHHFFFDDDWBBBX@@@<K"$u?@,,,***(((&&&&EπG$$$"""\՗
   !氝OMa~


43UnJЅޘ,7	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
JѣH*]ʴӧPJJիXjʵׯ`ÊK*eӪ],۷pDܻxkW߿1
L]*T,tx֭ǐR#H97Sݤ2#HhMcos]Kv?H+WУ灸?ggs|s'E##F̺Y6g}q%^wR_36~Uh*_s| JtF Bx(ѷ
!!h#Ap`1bYH`GÍL.h9`XXdX}Bm+Hib%.r
=H |67#BevI%m8dF`wL祄yA H"iOch?(dDCʫ7֚(0t*8op2²#lG*m\h
1	2y
xEƻ@ȗFI┤{%ZzJNkX(;<i/Z&"2"K>d跧y2+KUp8k"r>١L<X"b5ݮL7`вEl54hO%7<{#3tPe`6=vNm[
dlj1z[7g-c~3'xU/>2믓͐by瞇;Rk{%WMw۸;
Bˢz>i |J~{WO{s@ڻ'vtn`l(ff
L	R`<?;0A{R`a@J^M/~j@@,!A&XBDF*qfƾ))\
	.~-qCeyE@FQ&q"1ipgք0L84Qwl8=@w1W0*\!?
",l!g3N]jЄJZRRK	RJ,sD<3M\%
nT7b
j0>=cӘ3(8 .$Sbf3Jhᄊ[,eMbk즺LdbF:5` <M{E>aԟ߁\dfl_FHQU8eD
0$$4Qˣ U0T(ޑ\T
hj-KN!TFR5lnh瞚Rzcڙ eZh
卝m(+ΊִUn
dF8ʵ4ZNl~jM S"baX۰]Bclc{RdVٺT,g6ⳡLZ[iv-n7La(@0
dbiܿvn8aZNn~t[k(ov΋Ue/hkƷt$IorW<S@gYzc
.ː#xq',
#]mt$ 
Z8(V1ZlgB4NLacCx;N{-,
پFe?$
HΏd'8/K+%%j_}L hV^p7ΰ3\>xΤ|.ENq{{L_8Ȑ0.^?{MsZlS\)Da@?7XSr5DµnFRK8l>!M	PR3 #"vUWMmjW!rY+9BR;.nǶX{S|%;.䪃`
2;̺.rܹC 3k{*$PU%(So<p]doӺ:,0!n8&m:1!Sțjd`"|;|̶y'aS8p?hek?XֽcH	|~<\y޳Y=BuHrP#ߤV3@zĪLM
?ˎyȧiv[
X6HOzcV+ YOҗzg}M=F~u0nZ#BKG~'EEgMwB'JT6F04{m}LEC#
瀝Nwkm7KCBs.7OxTM@L|uPgQ4
NDkQ3<<6?CfUHkj?hސ3B%GINzDPXhP1KڗK`Jzchࣃ;>dSDtXvsw`sddlJ4
-R Nַ},D:=c++\4~؉{#{
cMzRGָ`k803Aq?ARS
$3h#x".KЌ=owōKW9EQ?d,8DD>p,dI1g[SJI)c4}ݘJ(^v6A8C6gsn 6"I$q-aH"i!U32'ُyXuŒ4-E3
YrC3$ATC08dDBT@ݤr-.qQM9K.QEwx\.NА99R$0VDIj[T`"EF;KfE.**E])cp]l$2nDKCD5Rcxd$Rb*W
TTfY<	JoHT@I4@.HSvAdAe}p!3k:-6F\KL+F$K$M.*HT`7>XN	܇tQ@
@gx	Zٟ@PkCgI)8\JIQDZTj!d}"$9&R.K`C6G:\`@1Qu+Dvd@MFxWS

IGw
.:M'%=`b/Ɗ0
ahȦ!"Fh@u`NoD@IQ,idda5ʨ`Q%{橅,4d}ʁ٥]	@4.xX3:6CDE:ĚJ`>BB*K|$V'*ZDgU*­(j  ڞQª
T闛Sʁgp3Jٯ1K,c{	k$;ʬ{]q4ۘJj:m%[qZC3Fj%!<Z;6bF1jW<M۠
%Q/)[[!,k9V33YoDL6	hEJ	f"+Pxo+#sSU1"X ˸sʵANMW[;I;rّ
%-++'<h'm]KUeKo3HCxBv	Pk*K-+sR'2)L_{L[oCkp<BLK{k$pf,yd0VK,]\&b9+*,u{rˢ!q#~P@
P
2{kQ-|
ikwOgHKro+z}kP-,7iRzG#23
.QS,
Ul
`0O+\ce\Zwu&Wr5,W晟M]v./Ps kI0k	d,	0Ȑ
&\艹</̬)ʣuXWFkzuC
lv{2l1Ibv̲40

&@̐[;͜L]{̓U|7zkPb<x-80KM'
lĀl60p#|eћ2= kР|%omG},(xJѮ`ΠFe1<&U9-<,2Ԟyww U"
kJ*Zԇ7~%XZ
|~vH`(|0V;
lM"zKub6YEpgz=U7s;^J"@
Q
	-~^[4
'
6҇)O-o1?Sc("9<.}BMh%4

	~d-,EyFu8C5SsjQ-!4D
$̃@`ɮ2yx. ȇJo{КkBX<MTGZ%Ƀݑ0"TF94
<~&Ґ`L i5g
XT=x\ye(Nd'S=Cj
w>!CGc篠pٰm0PN0Qlx8hEc	җO-R=b?or@#t>m}DonP
-
`
PZ`NM}	=(m%:4Y9-EN<+~EFHK~!Ng~o_||J0T1۴oZ	JH?6ޠ	TE:m90>sH){I?3î=ud7S)]QzC3KJETDdIްG~'`<>Odofoi󇮺o
.@F_ybQA
)sTG)2i{omM5{N_hk{@ٜ#MFqGiIsG}vI++O:o#o_2gj/$L@
DHn
>,QFT2`&]@%MM%-fYQ&1Ȏ(xP(ȍEz[3a»501&u GH!:@Y~VXdDVm\^iЀLU-BIs|2n`
ϖE,lZEMV0y`IR,Ͳ
JdzSfA~:H5ӦMhmPARɈ]^j\rmܹuo`]naQ|0<mnjqq@JGSEQtˀ
fLg2dgtb^@11DC|;܂K.K/DoıJ4l!2v$"YԻ=o@擏>O:D~O54Jwp%wDHaА883OƛѥT`j:uG))\OI|bJ.4P6.3$\,S@S^}8cDo5W:,s^E^^EܑO[#%֐%IKgMX)*uQ5*	H5YU*8
=SH6_}QFq9tVN9>cWemBj+l5tMySuTL:7]6cv@o@dYmc]gn
83ZBX6Y\^+@Sxm=~&?D(ܒ$Ҥiݍ6
aeVaYm
y3|ﰀLm`t\RZ7gZazQx$i;{܍j3m	jfm
sEo,p;w1Z
woq|`zf@.:ys?2t3Z21L![n]kϸ=#v
C߁'Zw<6!yL{s<%17@ǵyMg,*6uꆳ3C^~LC,P(	DbN`?(
2#i)Bnsc7vx)0D@Y.QbaؐFhTl{ą$ʁle)Ni]bEtV@G<s#\3*ĐnА09|=
V!
Y48ҙT7CI;Y.d5mq{^2r,A$Oe `>8M2ĥl<	:ӠOPd*34LGDqhވeٟ.ͭm(QB]:'	Iw` #@1.rt-m?mr@	?Ԩyr3Іz:EGTG43qd$ʺ$/DM3S^7A֐l#$U@IO	ӄ_s	mgY9泧6J„(G숖ԥ24ݑ94Kմp/L0l $	V'6q"~8ٱnyԶmkɵM͕\uU]
``+(ɫ07
ŧiCyc|6Y6'XdjC88ےa"+8d( ո T+MPSDNvc]CnťMu+F4J4
Z%RF6γ|-{!|44])0w)<iI8ı6&/2A!5l&9鬼ݠJSkY};$	o04B2T`NqG芘5gfs/d|
͎w,ю6A{K(`ƣUjVS7֖ŒF	C"
0#dwIs7H>,ߴ9
1OxÌT3B1ߟi&!	1VˆChBF5hHóݶ9Z]M0!Mi\R(qu;gޮFW'\E("G z>wt.d숀Dba6X~c.E0³m]
6m3|m2ZНnrQB-.ͼC)^oɸ<&IpR8̢{QGh7
#PRjC 5nʹ\p[Av |Z"aY2.i<-f)kHIIt4W1#H!EXMe/\EqֿX ^5W=BЮe~"JҞ0A~f}&xs#O:eϘ4tg(23-
v0ϒ,vџ|ne~V=]R:}==r	"!\0#CKZ>ϒWk!PSC=9Pca
XK
Ȅ3a0˼|$`c;Kt=&@.O;Zx@=(<$1@~@EHlA!S~0A*&&ky /
'g0L#)FA>!p ‹1B2,*X[Š@H=+EIp,,Tx!`@1ćF3|j1h0@FJKACC>\?LscA E#	iA͐YCKԈM,	x?|0·+o=QYEVDXE
o0]lrXYEX@Fd!eD@XL =
rD%8
q2X0n)Jkt``OpO`,BG04y)XI1J9)'3Ȳh|@HT%\Ff`VH40!/.0?Ayƙ4̕Ɉ%董I*Ltu,(C
 &hJ;&a3Bo8r)
˰Ѕ-(˳Ŵ\ˈEHrPU˻A(H,aIsH̅Ǥ4
h2L,JKJq҄K MKHMDY2&`>Qؔ+ܔ3̈́Yζ<o(R@X$$3H뤎NN=lDO*ٮPH<s,>DQQ!v7[L	ڜ/K۬BE8uPЅT˘aP4N@51&`PA<**Q`iAAL?8 S)G!Ř%+
&@*i	JP.-{/SSP3ΉE5P8`ҜK8:,c:L4*?=I@5%
2TDa)2HT̹ToxςO˰RYD{{dUH&0UzUU
ոdo` aV:eB	1hLVjUkՓlvOVpi	H8׌$
1[
X[Uv:~YP[%N]MsXM=*P;!"?ΐEk2YIvhjU|YґJԚr	8,i+}˷5HvJ;M2P4=5EN&@c+:ڈ-D![Z	DB2!-Y~KZ(P2(Dr%*{)	5`P
,E	`ْ|+bES,X}KENo0	ƊP0KLXH<B
"؀ih}[ݎOˑh2ё	E,^m^M^Fi
ɵBP 2	2Z}_PЈ_]aX1J_ߤJeP("`N[*?uQB@
`o͏,
ap^@Pa|Uf(WSXmPY\aЄuSSأ$I"6bhpZe/Z((V-c0<=c-
:5?ڔ2	_V]SpU=>?U
 GIH"d	/I01`dR 2\ a$PVIJE5seXY#Z[fx|Lx/c}Z3@nSFfJy"XFpfNKI.B`hB/b*^J"r.gQ^'JfϠ-x&&9{/1S _^`NhMSbi3芖JؗBkv6hE&Ri0gi?pPFRj[ң>h*XPEXhȺafIh.8>[f]:sXhkKzVxk4c͹x6gճ8aPjZ]G:@қjXf}ɇ>4.E˱nג<*&Y:JmTPDQeM20hY\w^F8nˎ}Hh`K=kS4I6--ф?XM$`~:&rR0dp
O:	X([=ҦmV&5i.<
h?N?Uo\#C"yu
o($\K3́^p6g3#PC/r^.wkژ 3+4/
5?	6-AaG8ǁH=l> ??[Su
)_t#(b,HC/0y?(s)v3YGQ-Q{x|JO})4򣨹ZA\Ǔm&`\􋻸Q@do	ibz2w&vHiLzii7:TQUO*	ȇvw@؉S|oBŁw"0zlC/i@bZU.<k:kcyMtS%}ҕ'*`˰3>A`ݯ={P^Q0;;B0 xNho{aE`Oe'heS+0nt6P3?L>{{#MEş60ň>ya-VTw`Kta|ȪMs9B7u0,Þ/[+ȓ}x׍.B b= 10%-*1"ƌE=",idI*UC!B(q"RPg<,JvA)ԨRR*Vj`l^,ڴmkhոPAbPA:uDFM`@QPǛH*D^TٻwdT2!f(3v-ТG!F51=v
QJHwkTG"IdHʕ.aƤi3EAs +گd\itI<Yjׇ$\Sֽw/_~+v8bFdD(]Y !vS7!(i	
$[o%b1HE"Ir	@u8TUTay$7
b2IU40Y!ͅe^|Y*Ƙ7w(0 g>%!yG}za$)4LgÑ@##2r#8B$MqUlj\<0C: ApdW40	4eeZܔꞖFvY^)&y&FMШAE
d2Eg^|9&(3h e b;d2
µ	$@bz\r-U(ꨣ
М*R-y2ՐL64k
rD(ݱٕzPGf4+Y(ƶvkT\rH(禦.dNEE@/^#9,i"3m
o33'
pG4㇕A<thqWrF0},DfZɣ
P.F*rUB#%\F	F`M.X[ u`SjҒiEܫ	)R
2`0~sk?T<|%[&T]4֊>wg>hIu6:=v;23h
%{_aN+82E*lp;9az@0L4/\!hD_#TQAҍݠ	@Fp9pDNx8KXgJ(o+	=`ׄg1E}r6
qc8:Бt!
i`eHCj@(?7r0jaD$:*bY$7d3/fzz3^z+e[g@5nq#jFӠ!zzc}l<KUy#@/x!aƀ
l@R$&5IO23)MU$jXΒp%.чBdS#ȡyEScT3hH 
i26m,Mo<
qs|	́`EUS&L&p']?*PFDh&7O=%?(jQj<wS&
#dIyY+eԜa)3`Ī"fdWj!J@MP@e&RZ<1*AZqի4AP~2"Er;OpaX~3-[+yILʕuD#qC浢Fz晸-.B"!XlihE8=lTLgrvXE
]VZ
9gԵHU8g[[>$UU
1+iX8dmp0!	6rF]8kZVIu
kCEU+G^ù
⾪JglæLeaNIph207)VM}8&61Nrbb,Eh52m*r`t$]n[|sA.wyގyVoNQ.3oYaШ,.7A
-zJg;v*3dyb$#l%LL$'VE[4-m\`pXEc O+zJkdͷrTr%6bfQv=gY0ѮfmCm<7/%TDk[#q+1KTF?NyC8e<\w=;B2N9'@8̾bjYyyr2g%\c\jWF	|ve"gD/9w6·g(%#=7zQbGQz0~"!Go)Gv'ãHPm'I-n({;~oKLIpcnYnxOjĶE?w)_a_X;?<A@s	ꕘ,DtE޵90!%[ݚ}!b-̠H}EuP_]aS	dM`@	HuT
FB>٬eTLHpay \NE{Ԟ`ՠc!LF(@KlBmaQٟ	"[	HXaU: ġY8"I	ne	b=K:άAG 5!)bR
!$a	'v"	͋i$"/"Ii!,,"Xǥc/!]~`1ɀ@d FVkAIReX57LTHMuc%=n:ZG;̢,0EEFRُl\tI>_c@Hd]& d"*42tLQ!Ԓ9TJJG&N;Tp IFIdTaȑ|(_M!z$1"mQL!vVQSjC7DGQGV%JHSVaрΗݲ̚4JhO"ҥ%5!&	ڄ\UU+:я	@icFT.bEd%W.dҗGsT@Hl3LSN6e4\_#bjjPͭSFl&LHV>@`!&"Ug=.%|,g4LLNZAϜpw~jRy&a.Ip{ބZASY''pgqhE
ш@E4pd&Z!,Peцax-9rqx$^{[MYqGF(|`"	C{hjPM2Ᏽ1iєb:_$ZפRJ"Lj%KPK^4tUSқ$]DfcQd!LEHT.jk^ij#%ρiR%{
B!MԄMM tѿڐ\(:\36Rp~
ZyTFDci͉1=ʠ240Sˇ>Z"~)M1@*`kPs@NE|4'TO!
.۸T
g)Ny&VAf
Eֽ,|&hf
ȌTl#<) ny&m*)O~XeFVF	
:|\j"+*̗*EIM'NܹTe"qd–$̈#|#sP >5tlA䵢9ڣ]!ips9pέS\
pݖ'M$V:)*n|r1d<a_'"@\-%VՊn.ŘJ$rW-zlO@ :p{%/.>G/XV⊌@ai憋2¤D9B$^`66/p]Zrp/p2D{P5H	<vKB&rq@;$
S0IEQH܀1pT,p_ppIi[53ūd3/V"bii,U(!x/)IÇhqd>бS0AfAz
)gn)[¸^!2)r#0sпj	)'3Ѐ+W
_*X2H)$Džg䃟tQ-	E@/3E".2,4_!/
qp$ysst(u#ƨ0syD+ G+3nv1)>3U!!t,ޘk	7hA!4CqDV4+sl(T]6A"u7tn	A@ݐ
Q4:~r:QsR*S6MM.RuJfZE3Vs/{.E'sF.5°XJ5YuSSA!TBEf
lOHA?$v,*U(dd'wp
ǻ-cv$R>@hCv0jukvAA]I77>4uZ#vMvّ;xqX/4tK:VwgUvvۣ\xCZ,UWuoy'BzV7D6XSjcFv}}L8~?]hx>
]_d7˕{C<8ń{aya$+Gn(xB8w>DxVV)׸hxWE5}<14$.ȓZIy
%{]eCPσC^F9y-t 49QYRW8T[4~
wvvj|8l{><1 i/S\d$	vuz\q\Cs:zEzyÌ2vHAS31s%ޝ0<A:kK{d;PľEѦE0TXvy:zC;xuzлú*(R')BA+z 1/c@{S|||yl## kEUecǃC|̛O{|=}~~E,׻0WW|#B0=f07=Qt,꙽Jp<Pܿ3@o=E`
d(>7;|C;c}?:LE'>GssCeyz}Ϋ>ާ`s3O=_Ż6l9FTL4Mdd\u@a͏H4hxUߪ\?B$9:jI[GA9܂TeK/_	Ӥ̚+MԹgO4O:hQG?D[SBTXc'\l4Ѧ0pR*gph5p]`tf B QD!5*NܸsХ3&7r&\aĉ/f쇔Haǖ̦ٱqƭuo߿6-,U+W`Œ5V-[pҵWo8}O"i֭f6{P!C%"KжgI!)()LY8%@j
kJkފk;p\CmB1l䣯2Ѭ3w?<m@<)Hn۶S,̎@?yEtPDcY:kFhʛ]Jv4.H#Ͼ:ɿ,j&!1'TlJCo:|s3,UXhTVq\IIENMЊ+RIDrlmIBٔto}LnXv,yC$DNDx^^̮`Xqdw,6hgVRJ,݋Cќ¥
LA\1&aIwy@58V`A	UiF1YJ.	'eqƙx8iAHi+}UDORVMx=$NF@IAb^g՝y&,"9胹bIFgz#l0|'%ǒXoصÅ]XY!0hn hG&|$z“1<i"b/Z3\p)^{AE!%&DwO0u2ZaGAwo?```E0Bw<cqsR2U/H!(A}N
@P	`&XB3Nڨ
MG%BJ]пEA0)+U,A)JƉ߻QSX	#$<ްt+& 9f4Z9X&PM-}+{St$H|S00)0:A[x#k5( w͂9c	8)PAG(Han͗DӠ:4,xP%B=85Rk
)g<c
67
:E,dIK<`TL's4<*7BPJMMFpg@*	sb# h*|J4iF*AbU4$(hjrńzC!o
"jXPQfTPb'*Ȧ*O	bLgZӛ
iB{:iLC%BƤ I(F͉NkY]UUXuj[UBDQ~6+YͺSAa[1G9jE/эjX`Q+HVѰz:A[YϊgLJ(<Y\r:9mjKnkupMX7e߄vt /aѵ{^7؄
exG2f<,ȵ1ͯ"Cu(ޗÌ\VYw
}b{{WN.l^o>uU[$NT=6~EnsM-e,Y%DXc;Mh[!gsO7ddTJ.1d(8S.[ ,㞄ӕv<	av"W2ѕ؜dԐWx2LAH4:FK7U:Aj>Jݼ	8[z
u D+	9=s>s!eZio=dIҼd5}?aCd/['![ڰpT܈m^{gÝnˣûoe|.ۂVtQ~jp-[`\}xVy;LyRj Gw:V^!\c67Ç5CzS`kȄo[GtWcY۰o{.tɽm<t!i7ۆaρod6l;y
4U_oQnU	G*}N<HBgغI~-UyUOe:w7)kMwOԑ9:M|Au؝|Y~Q?>y%(`}lnLF&'o7<Ǻ!XLրoXmm宾LhģD~>|S0/$X!p揆@oj<D\[%	J2aJ`[0SJe`0@	*x2,kb(+)Qg]
)D(RrJb+0zAրF
v/.av%hny֊
|0Q'L`qXfdLIQ,0 Yqk)Q%fL	1/0q!c1AuMQiQ 1aB!E28M$o_a$q$m8gMMJ".%]2ebR&io(/'!v&wh]d)WN¥l1ʤΨ*
$$2-k|Lb'q%˒((2/k 2"BQ0:r&2z0r .Wrid00
2$U1M
j.,s4IR13l2#4nH5C3#	br5Ys\6ys-?Luh3
l0%ղmz39sb 8m*KE,g\:ik3
β3(:,8<1l4,=JM\.>Ѧ<;?r @
tպ><A25O?B7\P4-CjvS:)cFCM{DYlEUtE[tF>SdDitG5'\䰍Gvssd-ֆ4I=C
TIJKn4J9tKQzK$:u4LTHEKtM{TBbMᴯ4FNQ6NTTMOEP	uLP55QAQ!5R%uR)R-R15S5uS9S=SA5TEuT4 ;_ߤJeP("`N[*?html/figures/optional.ai.gif010064400016050000001000000277420717757045100167230ustar00gfergother00002640000003GIF89a1྾̺mm̙fffffffffb993333,1@$dihlp,tmx|pH
$Crl:ШtJZجvzxL.znQ%{}"Iux#|%ȡı͜ʼͽ˸~zrywJqx
hΨg#\#~q$ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
=ljA*]ʴӧPJJի-;:c†9hY4a-%Jvnݺ$HŻ]µw`~ELŐ571Ǎ7vϠCJ+ Ċ׭ȞM{ssͻ4ǮÎPym_VMuijkνCrj	#h.vV߯<+qX_)\e6 Y2!&H>`zU8ᆆ}5""EH.c7ֈ."@HcCأ2	d.!OBI!$f$Uؕ[R`>*ZXhI`8R^G݁_A}xV'WbAR>.(h
2;(x}9駠*΄`Idjwi[:BDY6+JOe룪"xIG%y/&`	8ث_Vemтl(NynߚBiVދ&jNf0{!yY`o[`VL¾M
R*+u,\ȹbX*|-2<i=-Dm4YnfG7PG-ϕ\6ь3[5R-I49m_KfҪ.4'8-_Jzo mxkַc78:.W.6qZw2枇.z騧@3D(K'	1ՎKsEtd7'#xJpRwN/k~觯{*</StH<ȲxJR=~$$	rP<J?(L
@Q|awNڰ-@J/w_~bDPr*lA h
*~EJr~PzWJ+!Q44qx>vƎ~ i,+sM eęΈKIED.GGJzL#HiҒ%4)Zr}%S4^0b$$Ǽ2x\DRa۸nИ$;Fc|f3!̑hT(18p$y>	(p<<[aM(Ad2}C#JъlͨFUэz<h9	ҒU"IWt0iT^*Ӛ4Q)eMwәT=
Pq:,tHMj~zT:.)TSR5*VRr *XǚQ5+ZOt+\*K,W
/7
`KM,:#Id'K*V$ͬf7kXql!*qcl:9KHd;[|EZ&fۨV\jt8v	5q˓yk`N^[6rw#]wJgP5ܐ45LiMk2i.SEgEnFpwL蒴f{ GL(N(qH0gL8αwlcH=(
y%!eTYW0\1Lf@cȔ2"S1șяiˮr11_"??d-C0?"t:RhD/ѓC
>'Vt6R]i>e17
>XdP,YMb5f>kjⷫ`TOn
m/GI5klc/Vu4Tp<9{n(sjgn
\͚]lBň1mYS'	>SXqênV(o\/X˗J.:^Zީ/R/ʣz$'{fIuń^{\	W
D-|}Cu{CC%o;U
P%%g}gށ^
XĕkU;֢_maj̔^|]7^<0	=`npQi&(ۈk%mcűvijOTՄ+kG_(Ht<|WlE?mu&Ļu?uE+]G{mcvvz#t7v|t	"{
J}a؁ >$86#X(5',h4+dMaDdJJNEtIԃH%a-B/HQn`Em؄P:GQOV?Q4SxEO^J<dZJ9A8k;'MWG	;UoOq(Wa#~9tPvxݔp|RaӅha(`Aq$ц,DpdQOUȉB؊cH!t68O>]TW'i4(1Lxȸ-c4(EȌ08JNb=HFd?Dd۴EH:UИ7HXT؏rǤYQE
ِÐ/YBّ8,"9o9&9T'Q,4T2o5:ٓ“>ٓ8DFyĘJيLٔP5A2Cڱ`WX_4aI}^VI1jwc2ZB
D[A+tHZ֗'8X)%O~l9/Qn'q2sIz22?q:q%@ӗQRYs#Y!9Lb̆l9Yy~c-vIӜ)gwYyڙܹٝ9YyꙞ칞ٞ9Yy9ӹPN@:Zz
ڠ:Zzڡ "$:&Z(z*,.ڢfd
ʉ8:<ڣvbf	5
ʦ
{f	AlYeO֤
QjJFfZ_Vj&Fge>I:ikPdf
h
PkKdhgOz&@hiv[j`&ffi*i
&槢ꨝ6
谤X*zVjCVnj2kC
 
Pg*~VڧZ͚h


1ڪfhꭜJk
Jdg
c
ie6ЦpkJۣzoP\۰;[{۱ ";$[&{(*,۲#++S4[zVS~2;+~18>@	!b)i=Qmz%Q{"!Yr63a3S|{ق7̷]{b+µGmhn'='Y^;|r(R1{0{m`z{c{6"m3pVXN2(+(D;wq,p2V6spẑVC2绿KVv$w2Q*{i^y×m\彣HQ3ŽRDp-+p'1[gZz
X+Os+R.ytKG|mX{uUw$N37k#v:׷&KvlB$X3Ƕ).)-\2d >'}B;#~_.
87g/s^}Ut Lxŏ9($tgdM(#8\#LQ+0S.1IQ7?6M}B~\6|NIBvs 'x;s468tScTp7x q{ska<wkʸ,\f@{KZ̽"zȘs)R|X$rlgz(‰wc1Ƕ‘vQ"w^yvVs|LWV̶yy~5&jvVņ",n_uTGGo|umLї2-*ǂ<8Q}.ι.QR{p#H#nWT7ṁ"]mR_
>ǵƽ\un݁p7t}v}׌'z`fq
؃|
cG=b;ݵRAǾL=}:[C<Gt`vo!
&\FЁ-CDV#]v
mʽWx5MW}p-ĽѴH0<!7ލDqL^D}}M;a(Fk<܋<`SݓH??A4J	>O̓
8h#ގ@=ސ_U >U&K!
S(|zm,MshYw$NH~x.0Λ3H?Mu9.<^lEFGGI>Z*8nhF$Jthhd]B#>t^tȝs~_a^	3X4KU{ŭDod<ƴE%DdmP:XoLW>E2(d>~F>!\OXs>>%$R8nS:
;]S>RR^u؍odIdu$a^4䭆Fkhue=2~RIhX_B!R%"Q$;nS52хMiF3f4ߵW𹮋")'ƔX}H^Y6NESwct%Wx=tvzP|oՂ?]܈Ͻ/ݎݔ_},_W;V/H~O?T%oEAC;ܵ_HE@ʿt_U;_>_1<?S:oaQ_o8y±<ӵ}㹾2ɠPd$b`)jb-1l>5~9ht&M'Tf	&J!N*:FE>NR^~YbM
05nin2ƭJMƦ֦u}*2=)K\!S)#+I?/]Gn]S'k+4CO?;G[G˓}W+Gӟl<qgz	L0?Hp<aOߛli<j)@c&-cSz,g1ɑx*^y.Ĉy³pOWłɣ;\s`klY|TgfHifYoWڲϗF"TOޭ8qxXn<YpΤ8>m%j[[Ğ	Fp۾.|8Iufl9ΟC.}:֯cϮ};޿/~<ϣO~;CA"?>>8"x	2
BR8bxrh|7졘+آ/3xr;أ'CYG"K2٤OBSRYWb[rAF0X&fyimq9uybGQZ"2ڨBRZbWؘ'wKZj*+Z+ښ++,
[,,*	1lr*)ʁ٥rۭ߂:y㎄2%|斄^;{Kdy@oGI4;pq_L7l1iL.Mo?1mћo=[31;Ϭ"m4@;=2C]RۜEcYWG-N[|MtUG}[ύ^3-Pd*ʼ/a2UisԓOxdKNw:SK'Mkι睛9Vy~M9aÎv첷~뚏]z~_^<Gz==d#Gd.0ˎ7_9rO>?<?ᛮ.|kxDG4z?hU#E=]AZ.jf^*R4
	ZWpg7
cCc>_C/9bh':mva(Xm]k^AP^2;RhƉ5j\2Z}劣TF2r"S3%ݱ`iHsQz$KdCF"GOLE
$$;O28I$.^(`&S)y,kI[2ܥ.{KXfpr%cJpS\&3gB3Ҝ&5ik
*?\'zSo3'9éɛ\';w3f<i{3g|4?3Ѓ"4
]h
6HaE@RD&͐g:RqP"N2(A[D/RVT)KB
,3-G9ZӸ/5Lo54<S$*Ux)%A@iF142KGַUBI\Jֺuy-k[ѽs*abb5AFBVkx`jQ%==kO7׵w^;KZVf
FjYŰEI+x_خ>V%QStU*@&
ĝ.]^7}_,ڦFAEGogk^|ֶ"0ı|űc8VKRR7Eza	7/8?+X
(1.3
7@Bp[a(wb78^Hb9B悌q5~׫xR(M1|w'b3t&޲D\7V5a`Q>nQLV3KT8
BF?\4&0#(uдo諒)3.573E& ֲ5geR%[}Z7Ŭ_ڸ9wԹk.Mb
tmoߦ%}mn4-t[nmjǴ~91]cѮHw]Ѿue	Y
QP3ͤ65O_W'"
fztEO"\CvmrS$ѹF\x+˵
iu=Vnn;N7w>tC=7F^t^zFra;Ͼv]o/G!O85ql|xuMt\~4̓>v#:uy|&Fї_OOu/=2WV?sW='y&	wk]ݸ
cEy,̎yoׯw`S}ǽ~\Ͻ[[zԳMg:I]_y_g_E]۵& \@<`1؝A1	<qZɹҖa^W>T	9]T]Xd_;By> ^œJWiVxIaaYJ}!	
<S^XX͡8@ 
 b!]i,ZT4>lL8 LJ@y~%G%$G>^tUn*""Yhm!)bfATΞ1 )."2E9[_[8TM[u^jea`ڼY=#3Ŗ7we_]~KDyY{j_Qe&- ^_!$#`#D#C
$l	5!e
$,2&	])Z5JZA[(JcT|^HcDdѽ&A^B-dDYK^k}%bN$HdI9bH	V
%P:%$D]zA[feed5SRPJץIAD@.bK&ﭤB~`9[jZckTde/
Y^h%X~jKbIeI٤
b5fk@]
vb9=lb&@$.pd>vZ[Snebsq>awzg@a,N~ygtΦ'xtez|*Bx
GP#clgX>1"V"h8(sVNt&hڡ}A^2rRhhԇhz*_ĝ芲@hhNjhڨjD)hiRi*&:&"oGeҁCƘ\n"B?5fr!ZYŢjib1F 8:ە͑墮g)adtRZ &iWEZ%e"~VOߥ2a
cP%j%jѝ&@7BfE_njUumBU&de\Sfhgd*O.Hi*J.ibkJzk뭊k(k(k(k(k&(k'k'k!
l!l¾*lR:lJlŶZlRjl
zlȊlRb,De]ԭ,˾vA˖ă"(RBӵUʶmq[m,܂ill-Z*m]
mךmنFv&
"¬ڭ &]rԶ!b]1.^1ОnڶlP>,.Ԇm
غ҆n *.!&(Ю|n;nﴦooΨ*o,:o2bojroz
%VZo/Blo-
! oT
w¯9Aoq/k7(nR.Ѯlޭز^ͭ ޮS0jG0m0b[4q
C1p<0,p1Gnrm6ΰFs
Oq(&pp,Њ0

ڶpqkmSV n"cr!2*2#/#?pFN2%%_nfn2''iT)r*2$/	,/&/-2r(2r..c/p03n:̊?Wmo#s2/}6s9qTR[q6_2oEu8}0p3//1	1s#3s;S;31>m3q@g0AWA?p-,HkAWE@c4jCLsI811q>16E4&sPP."uRKQ?5FT'B*U_fVW!UuYYuZ+Zu[GiQu\SWu.u]]'.A8߱3^,^^oL+LMO߱c.ema.bbӁDZmֲilgײQ1_	vp ?l;![FHh_6wߖ9;gB3ض_r3m4nwvr(w|v}o~w;
xyW|#+x}2xr6iqϚOoXG8Mxk\\BB54@{xViptߴdG=333 38µ?HG#8{qt/7jsy#X9vڮs;03I??4gUm9>)wyMd9'4Ӵf3wyg8zy#z-7u/:>:h?Czc΂z쨓zȚwlzƲzWz7lzzzk{{#{*k;{B{Sjxk;s{oj~{.+i˻{;h{<z+3|C<Kz[c|s<{{ȋ|'ɣ<?{˻|W</<|{(}|o3}z:ӟgKwR},ck{{=}ؓ/ً٫}^}ýղܷ۽}OOl~#s;A~olSZkq~a|~V>~O곾ջg=1+@~~#+3;CKS[Iu|s'z?Bdne@+T``l9,A扦ʶn*L6{Λ	 HL*	ȥYkB3d0(hk!(0#Z>;>t\ZWf%v(F(AIu`BID	hY#zr
U*ZjJ2XrVux+2[gIyRKDBj3bM}MB,$ޕ;=ӘzOz*Z꬇twEqp9p
lIEܗ/q!Q#Ɛ5ʪׅ:B\Ee="iǎO86rC|4dH7=GȒ\qvzT&QsrtEL"yEŎ
C0NfCް0pܪQN\;zoܦ,Lk/
KSo1;'3>k4ՋC)ב3z
dT&ReYͻީ'pc.5߸5=Ou3bҹ/2(Nc<sBځ`5܁5zMX`}ȞHNwazuHc6ވc:c8"IdFdJ.ɤcRNIw@YeZni#A\Iez0~fn	gɉgzgJЉ!<
Jhh.h>
iNJi^iniǙZ΍ꩪꪮ
뫲J묶֊뭺뮾
K&6KkhgBm^snm~nKn枋nnoKoz@Ӳ^pp
/p?qOLq_qoqc,A;U;֢_maj̔^|]7html/figures/resource.ai.gif010064400016050000001000000533770717757045100167300ustar00gfergother00002640000003GIF89a྾̺mm̙̙ffffffffb9933ff333,@`%dihlp,tmx|pHGl:ШtJZجvzxL.z.
GAdDG~O:}{"|sHvz#$%IuȊxpwwoӀNJM;(\ȰÇ#JHŋ3jHGCIɓ(S\ɲ˗-iBд	rɳϟ@
JѣH#JJիXjʵׯ`ÊKٳhӪ]l3մs3
#ry)	"~UJP8m#K
nV٬͛?wM42'M
6Ͽ|eϮoϼ=xnk=Ũf2E_ث*]ώ}Nuw{[<%GijqBFr&b1fvg hV&6%T0(Bw8<U("].hH&iaSFPF)TzjC\vTM69eف&hf!)g9`xgWM]AA0@hN(&hJ
饓>zI# 9稤j¥	DJUjNfzk	i=5ʫ*&|AD6HnilbuYtUJWJ5ndNY2 jVk/^Tj@tVW
pS0c0{pcg𖌪j,;щޝ&l >'P/D}Y2LZz<rWfvl10Y!U=Ѥ!jM-ٸրpc{]q-2e}u!]qf7k~‰8KL՘ww͖έOwFy.V팑ڪ^aoڮNPIYQK-Tc:•sȐ8vaHY8eJ:A&%+sKw'@2	0Ǹ˅q\4
mm[ %(1Ma
Y2\ܚ7Za a'Cu!
+?!R8C!&YXz?	뉸ߤ D'f
SXHE,Zh2]Y8p*6ڱKn$˘M\3HB=n4 [9E<!AѰlԡV(G4"O(X0LVԩD,;IGe¸Yf.)<Ro[L2$Lb:S<d--ڛdDǁ.}ܜȕ.s7&7O8>n[&њzƘh \ZW=R_<&oXF(ЊZ4OVI?ZxzPq~]%M
E1s\8EKFSfԣ濬T͒<yspr;[iOSD+V:Vr<*YΘpUk[JW~r^TR-nqw^Jw*JIrbk,~*&;0kSMtRhѪ鳨#DTޚ )IK*҄bca}K'W}E(Q[*Tm1#_H̍v;]4׭NUAVKFŽ7b|+z݊>
U,@^
|`2X
Vp1aw
/L_/M[PĵriCإ~*qRW>Qu#ظ]2};ܞxV	8mzψ$a%DF{d$H6h>;&"gFs"oxf	ŹT1D
stqT{K We'5)EqxɠtmV'Ј%LWZv>u/-RUYgVuoEj<r*2r#dmjKl^\Er͋s*oO4&/7x~ޞ:ӧE&hW|̪2i;ijV/XSXxơGqpkЛQԖS;|Z^eOVmjs+K77qYVeՕ\ோ4@mmJߣ;:c&ȹ
ly_E:~35Cgg]ڿ*ޔU*ȻNv޹Wv	oS>?̤p{s)zS)_MC=fɷUng=XQ1(B?b^*UߝI鹟{Շ/m߶/IQwZ
E{4H
h%տN+yVjQ	Udzg
/}}8Ҁv	(8o,fKF"!#Q&G0,Dׂv1m6$8@hW3J׃7J#<hK҄N8#?(XUYU(<W`X;[q]87_hTXiklMaJpx!s8Qn~(z.ӇX]XghA%Ȉ(CWj8+tx؊8Xx؋8 5
ĸ،è8xXڸxHh(0
ਊ"H#1hx؏؏(NHI		8XXI
9(
Iɑ!xY8ؒ		46ɑ#	+	)LٔӸNRɊ@YXDؕXIdYfyhjlb*mr9tYvyxbI|ٗ~9Yy0
@
9YyY
' Š`	砚iyi	
	٠AI`

`p	p
}`Ā	ԩY IYy홟ܩy)

0oi:ZZꠌ)Z8Z("H[ʑ-š>Q;A/ʣ;4hSYq2Mj!'Q*k"&[YZs2 %`JZZa[HZ%ZfjQ*
C
Q6;3j?.Z.{5<:rjeHT#rYYbQZlzԡ
~Nzcw^O=J|g\q5oP$Z(Z]ꇽ?AQ#*r4ĺ}8yեUJqKZ'dY\ʬeiucR6o6L'

Ϻw{򚢞%GW=džMxym:WxwxðׇC$9zگtSJtrۯ7:{&;v(*Tcw5Aws|U3i7Ay={f9=<xwmS8O/K8 
r(t]%۲Gfj蚶~h5{Ҫd{Zp励|Sw*wƷpfӰL683rTKôuFW0$s{D+}ѷTƹ{DxP:d]E*euTGaGpۡ8J+qcmW"`='0C@}'+wmvS۳wgMNR5hmzY@&%zsk=@FNM>ܿH21T֛lǰIO}շJ%ox2y*JVuu6,j?,ud2E-(c4>ZsEs/,'HL<p7ߤs&mKf`83I;qXV삍cXjcG;ǮքgoIlYwu&QzoaiRqYw|LX}<5,ɑǭ+e^Y#̩4Z#LY
p[:kREKY@ZzZ2s'窬"ʗz{e&Vl\]R抶\jkt@\ȶS|RXǂlһbܼ1wef`b\`f`bvFla
<a-;sž,"SLbjlx\bz~<ŋcQ{5eBJçV{\kj]-G׷ܽ4w^ͧW}۹R/Ww?DxQ̽FickYmts5~ͼuhąe}*
emov,, |"	LPbQzc8œ}ujkҐ,uݪ@N%}M;KmM}>e917NCml+>Pp]Vr=׹ͻ]I,5ug

<bX1"vxӣI`f9Tti x<3Ik%c6\*S+R3܋ec/=rmmL^ѷ
'>N-턜_yGޚCgM!4I4n$gئI|>N&$ykAdk	,@uVtt!{JDni?ރ\{[~v⅖I(DC0N>DN/6xGpWmH#a-:u~lKfvvuQsy現K-J u鼽5mxN~hނ^9u&~SpNq
zI'k>Ĺ.n8.OL{~^_^GެN&]z^qޞz>>^p›HG\I_8*K1iai=ȏO<yYYOBMI(!?,316.ؐ/ ْZENA2o9Ci'G&9_ϏKO]`?Yxg3A9RKH?7lotvo<	c$ϋ:sϖߘy_/W*u0?_ʟ̿?_y' ?_?_!Y¯ӳ]㷞 q(4JeD:)j>-1l>5~ۑ5R)b:M9؅1!("1j9vA2UНA]ejRmFvz})V
M^1-6e
6jBłNv#'[>7G.ON_'+?.SC7_Gs[{W1fS{gk3?j k
%,_ H<d(.i(m^v!M~>[Ѥ#z2u1|+_
,W2~rrHA
B*U4
yq.AT*v,ٲfϢM`XBʹ	#
ͫwo|,x0†#Nx1ƎC,y2ʖ/cf[t ҦONz5֮_Î-{6mΝA.|8Ə#O|9ΟC.}:֯c޼7Ϻ]{<ϣ/[wܵÏ/>ϯ:waX{1ؠB_\WHrء"ƛqqMB%LߋXY8!jdBSZ	9ۑ-	"	q4F.f雕WjWp_	g(Qh᱆"iDg29dI	gi~٧IJ(Yg6A9'C\Yv9UnjZe^eSrqYکr*:jº+bJ묷Yqi`yh騳RRmB*"#W_JiZ믽+ܩkĪ+*bk+\J"Z=:Yy^hnJLel+$p2#70.+k9p{y<xK3MƓS#Tc\!ݴ_Wtf]gp['o]]w}#kj7wy^kI޸㶉5S^)stck՗+۹N6=l➻7> KȺ۬AAy0<N2mϤJ͢/ݏ*ģ~vƳ$Zݟ͗FgPzbB>Dx
W@vЃ"igS02)
0z{!=`S@\"&"BIG$`+
'|>]#83j1tש 7#?yaDo8FAy^,oF2L HIǒd$357m|#)4EIcQ%/~28$YKⲖ\<'uBie/`Җc$f1g`yN	&7#Mj6ӌs39DP8۩q3\]ttֹ3'JghX~2V@еSM#(E!gQK
eT1|Ĥ27iRI&3"=/KLG:eJRft*%"kjHd:)mz˕S'?C
vT%MYv-$ azR$
i"yICnu`YK,+[֯֕bRΦF|͇N}X_N;,b+:,g;̚',MbSZnֳ]-p@KҚ< lS(ⶢmCYgb~mc?0TnQ4b*V⪨rkVG7rhzB}_'JoɡcY9XsUHHMXՊU3Yҷu^u1#\ҹ^3W|`tz-A
WEUn)F^	(ݫ)e$'i!>r|`X@Y	.ks]@>k~ѹo[IF4Y3g4Β&`	oiJ?as}:ԓsmhjҨsrY-9ӫNun|=:ו%L:ulLFc[;
]]v7m=.yQ^B;ٍck_Q6|Tr{eN\L%>781SbrU⽂U7/bE[6/h¹Ok%!}<17]UWB?[_ɽ@qJGtw?_:Son5/_]+=,Z1[.t"G'z.vWde}S=n%.KG޿.yǧ	0x▷}wwckJVrdnU,kJԙF*qS>0%MQw\W/fGwo|7ݞO|F{Z~<Vk7~Z,?)3\7ԬIl!m~Vg
oy,sjT:ZPRFQI!]QoM:aSuTuPR^N``~M=ՍU]	ۓZ 6M	zatT.
Ij}aKMaVjʘa2 b!!"b"*"2b#:#Bb$J$Rb%Z%bb&j&r"'B݀Ry
a*(2"",
P)~*/+Rjl-b.NZ2)"4ǀɋ̗#	]1ZhΧ#;\7K
?u8#9*#??:c<ER#6qc@@dB1)`Ca=c`,BZbV2™)NkK&Da$!#U+*N$OU_14KeW7Bb,ZWekXa:MtJe]2]FG]_%%[re}I^
cc2&_^>&eZf^6&fc>fb&dNfvgedj&hg&iFif`bGLq%tTynff.hvjfo'g
'hkqqgh&t|lMmfvaC%tGuZ)a[`?xPK'{jLyg}"G|F!Ujd`J]$Ɍ}"~ꢥ%M PL'YIeP> }\JWfWuquWEeWQ (^h4hOV%
`k0W3V躵)&\e=aᕆhZmEAY(\mi)`1iB}M\U))i\rY띔1ܘ~)Ң6ƹhP)"*x(M"
vj\ƈWFfi$S]V9_
~*
hު[jӦF\":}'F	V^f+V~|r+bN])n؍b6HzQ*Z+4b2f2BNar ]zX!K]܀Y~Rl)!^^U^¨xali]~U,Mkn=4nh>a_*g^!Sm!^AXRKѮ,Q6i--nU Akc*Njl\~m†{m-a
..~%tN!&2kv+GyT6xۺ^
Vɭ~v-VNE!AEֺ	T-ӿU-n,^nAs;n'm("*FZ-@!Z/*,/Qz߯*ٿuS2c_%mNY/oI\,ۍ⼆wI^Q!i"n
~)
Nj":z=mnU1an+h)𕢬ʶ^"쾥0k5䒡.,TC.0VpYolq&p o__ub"+"32!&,! n	6$%%fSqWjs|)+&g1CVnF9E)e*r1vw{iC&׭Jp- jpR"13-ˢr4m+Zv* Sow 38Ñ8t
MiS~r=W]j/UR3sSJ^azsi@o>3hَVMA_ҭ3J]KKt4ZtMjFuNwM'M5<eOQ	x2uSS[gTK5LRU_QlruWWfXj5[Y{VZZ5gBu\ZVk5zԵ]#\^Cv``aa?!*bSccCv:IRve^u5fegʉvi31gwvशj+ic`fv(6vmmo^nvo/Qpp7!wrrG]s;AwItPuuc7i7qww;w[xwyS!k6{wVzz˷@{φ}7Ԑxx#x+3x;CxKSx[cxksxOxxxPxox۸8{DʍnxyxxCxȌWnLyn$C3AnTywTo+_o[98?9@K8Ƽ99x;8Â+89'zyCy9+?99[W/W::cK+{g9yy˹:Szg{::z:'8kM+{z79:zOy3x#8;:;{{w8_{oC{;9*;s<w|ȇNj<8ß<3Ɵ|̻|#|?;<ˏo}#}+3};C}KGPc}kcs׃}؋}{؛҃|ۻ}{79}}߇ˏ~#~+3~;C~KS~[c~ks~{~OG@~~~~~>O;#+3;CG?Blw\Zhs{ (~ۿPA8TH扦ʶL
tGb40ԩjܭ䱹>쵻
&wuDThIYiy	*:JZjzڊ*i 8x4){))TD\l<\\*Jy̙]mL]n~n:I뫴ީH/߸~Ů,젰Ξ1DИC9h1#ō%n+q@0vRdEiO|Ǘ!D3Td/yqX%0eHi`HM%h񦳧:5+VaVXv+کZVj[fϮKV7
t3z6籠sE*bmI=+7[%3WK.ͥ1#45޼r=i޺]w;

~KUKƚ7E٥
8뻫qo?-`xb<F󰻇oC3%X<A&u_4aQ&[^&j9/yadb>(!*`xsx"#>dBIdR
rh]B.9RF)	S^ieXne\~e`)fdifhflfp)gtigx9@\B(BDh.h>
iN*B
$i~
jJjj*k6@kފkk
lKll.l>k,,b::inm~++ҞnnoKoދoop;-Q<-
/p{J6 p_qoq/xr**nİr2Ls6ߌ"3Yr$	tBkq0tJ/tN˻<tV_2.p^
vb=o$O-jt
wrMfl7-p.uc,#kn?y߭Kޤpz9
*蠚wn*x;S.ޞ{bXi_<"Jɧ߀w~^7sn	~Ӟx;~s?w_4:u./3A@Ftl(	f)XuB{KUؿυ}-LW
e=p/gwO},lE'0/
XA~ʂ[2EV_Ƹ=^\c8*P۔%s	{@qZD# D/'cI'v,b!Y>=B$7Ť	Zz#4ҌkxA0Qe-o潱.Gᐏd%yH$Ԥ0)HP>&H@R~tj&3f(A6Jᕒ*hA
de=sN{pk'Gmf1>sL3LOFrAGkOϤDItj{KVq<)HG]NmOJV#f$11Df	JtUI.MfZѠC*қ넞[ESّui]LkUlk%`[
nUD^{ps+vjdeQ
Ϊ^k5d?`r-iO۴R
eGv)ܲMooխqwmTJWe%s]B.a%6=fw-vއUmeϛ~u};w*,]BAQįM_*xUɭ/GҒ0@ObZ?\/xĦZTǩȳx0YlU0ol9xlP.&*ccƱQ`SZy\GV6h-dY++Z)\
l[=8CUTT[Xm;NA`x&gTU2MEGz	2'h
0z5?
jS.
9ў+jXOլv5gmkXg
Q'ԧ~@"պftc)fGմvq^O{ܮ}d
լ9Mrgzn6n{6čj^[.o
[_`%f	dze
H`?[W<Z1Ƨqk|S5x3ybٜ G݋K) ._Ω確q?=8:խ.Xtn<X_{޻}g8`t	-Ϻ.u=[;
?>?;x#>ꅏwos'ЇFWN6}oo<zS:zϞ={W|l=_r>Go~vÿ^~>}{GF\52iL7!'wX7ypȀE|T|/Xc
uEY'xZ+Ȃ-/1(3H5h79/L~()*$[&IW#hCgaJ(^ÄMVH8_%ESȅ8SV:Ox/rWgv|ѷ{2k_v3~nu.`x `7XW(Wq}}{}14/0w'sև~g_(w:zvWs_w(~|h{s5{vx}G~u~v]ggajrzGzz؋sV7ic|vx8{oȊ.yS׍GxXWȇCHqx>'8x7z{iއx9xX}֗H{{
Y9X)m\(0-t{t6dth'ZW6	;77ȓ=1INv6C7yd%iC#W	؅m8Y6(1bIXrh2[ɉ-ɖq2t2͸//2~~	ZvI	6}ymf*̆n"<K㘓l϶kFiFmo)Ji|SkwjfmXv/)kkInpH\喺›n霱I	p|"P	/h2mh6&kYg~/dX|h331rtHT5*vhቘZЈtJw})UIVIO)ByL)N-ڔ8{Hxǟڈvl.Z%ؑ
Vl
jJ]e'qI`ԧ{	YyXvjy	}	`jiא瘆ezc}ysJ1ߦnO*B?7izӸW'Z{jzz1ʦa'n:ڦj:wxZꨪlG]nFIBÞ&w|F|B]jj!ZHꓻ7dS}7=YXʧ}К1co*Rsa8^	y/
7dÛfnư6I	
䩰kwEW]I)kB
ٜҶn(*4C7͹&'{i;
;O뚵y2ɴ_+\7q`:b	i˗"+_y^q[6l[rPCu3[Q |_HKd59K4~/r)/)/Skʚj۸*wetY=w[:Ǒ9ӊٟ.Kr|Wتl'
r:*s苨h麬۴{jʇϸwV*-(y(
PIj{*Yz@zgꧭة맫ʮ٧ȸ˿kc;d)ʣ@z5Y27JKG,qZB:$*8jE:Yv, {]<âٱ՘ßH'I59T<J|şČs^̅*ikm4؃Y|fLhgX^y)iǀ<<,,4QZ{Yy|8	\ƐqkRWW!/,ldVu9q{tKݗ),49ܢz좨qFIŞ|Šzw_u|JԼė(|[{
ˡ*jj=lk<z}슱Jʡ*Ο9Urψ$JX-Q,{KmY!xӹ	=mӲgM:ɵ˶tvBn1][|LԢkԂvh6n6Jn<nX+/k	WzjL+;I0ٲ	K*Fid]*9
ק)`yl^]njM@;ٓ
={KMYMjjlZףYyרIvD+ا֓Uɞ-:]
ܦԪR}`
D
߶7͉,:rȥҽmܸqrBѭ*rR?M
K8[z]ʼ.:C0A-z
e׾̾ܬ뺭lڹ1]c\ѥ:l
 N	叶+ytxȜuNvE*:L#K>$_;|֥<V~f7-Q(@_.oY^[P+Jo>a.t~qs>mw-y煎#֫XVSݳeX~\|
*eWKMQ;
k̍5EknhRU](~~Ι,ڱ-;LʫٚTZޚK4,d3cю1k^b`%aCPHUed6IU)FMn΁BxcvbdZaP/ddmU0HgfJQh
f/DDc4Ffd]?nKvM,.q#dkv`dTpyUe7c^C/wH*U
44(&D*I*֗nkLIֽi?PV]zڴ
إ'Nغ+󍟄lN[+܇_؉׎٩y])xr㳿絯hֶa;ؙnqy譥GdY^5plO筝oʿ PI#PguY*s\[7u.#2\2RTVGej:F",3:^7<^uD@_b_JK%$L&'(Mh%g&%g+llTUV/p0q0kH``bd$d#*v9w7-|<=-Wo?IL>R
	MTfn]6w70NR9m>xz*Wl).}Zx}!h&Μf%ىAByTD2Quz
SmG#ǹ+XWS'ڴjLUC<k"z[/ybsrv-ĊvV^S~
k̚7,sY_GycYQH5زx&ڰҺwk6!dEg/nh9ӿSn:vyg/o<ow}ӯopۤjj_xƂ6yI8!\ӠN"(a,q
W!)υe!*"!1a#
2<h""4"QJD#c|8cZ
e@r#dz	&e(rB"u&CEPЃ&Ka',L$Z	U'ИGegev
ifm&YA$9BMR(b+eZ*İhxN	aDrzFۦR[$NвfjK4k4Uk({Ϋ)o@i|Ƌ:
/|06ɼ)Y 3&H4Qk#| ,qJ1|
\;G.	ߌ4&+)KCs|;Ja9[2٥a=Ӑ4tWtOk-5,4w7tr+	ϭ5v~NG)rٕjOp!,bg#ۨMzSSzu:껋1>8>z?׾y鄣G'vvpKq]-Ifԣ"v2pΚ;nk>8>zkyjSZ Cv2l+\:anBD9ďst^]"T0T'Ck2RVdbb\ʃ5,|
ѸBMqZlDЖ$]v_0iT@~*0tc!
ޱYDz}t&AG<K3)HUMEPU%,r̡	͐L]bF2AesۄLaj`<woMp_@_Åt&O@C剶6-hyy.>OSdne+xϞd&'O{-tv"^ֵ-3+YL?,
ҙ1MobZַ9Ϛ5Zf3szÛjӍvs^OS
c*r,>E.с]GApl[!^niNmiS]-:e@*9
KM7q<k5WHurU5j5ԜBL u%kX=/m?Qm&7ޔs=-gp-P,g0L[kªM,2fӁ*0
/yz?rs;]xV鹮wݭw/x+_^wi3%W+ÿ%~	;d,	v_)
^Oؑp2|&2%~Nbؖ$
q'k;)LF0& dEF.X;况 +ͅɀl^Y99;ϴ}le7NJ!"V*EԱV{=qdظ89+V 2/r&Qm_p{5-^Gҟ(-:_Z{sm]QsPN=xdcBrgI-$=%nPn6IZ~u'hmC`{5*	t;AջKGf79-|_K(.S
iqQ%4&n
cU&Á(D"2:,Mȍ!sNE1bx񋳐x_h:Q7lT[@2qYy{M	|ᓴ.C{\ ngmw+⸤rl~5!/-q<b35hp>$rV,3O!ǧӮ9r<C(bN4.W,-j
ey6
ND:ث-6Iӟ	G}vȎ&mGKT:YhiC{E+={Le7ճ~!_ʹ_gEζgeި__
PjZ__şA5LVpxkZYk%_MjgٖlՐޞQ`a-U]JZv^qǤ`M\`4Yzae :U9!v,XM!,aD!){+SޡbG6{ѡ!aM!8
!FK$"1bٌaA$v"PbY"|!R.!5ٮ,M`
z^ġ(&)q +Ba#y,-֢8b]V
1 	ٞ\UL#=#2FI̞UQ!#=ƨ*z+"%#)`UVSA]u4^iߤW#@-ꗭ
99I#8?eIC	Ҝ$EփE^rƤK$MAF'	OP%59RaS:eA"*nbUUbW%޷	Q,zE[lY#[ZEs%]DњW0uPpyPea%e`^]g>bn]@]j]v]Li%V!V-Ee!f\.j'f&Ѝf!וlfbZ~j֡p^ga"X8bxfiٹwN@'{jvgi%p'vez
&}ҥ}~ge~'|T'bQyJngEWX⧃.%beNOVSJ(Rv(?~(Mr#^d(X肪gu"fΨ$h8(F"!h-!b&%)ڡ2FNB!anvj)vᗖ6"a)
)Vi᩟F_*j	*>Bޡ6j=1]^^zrz\x'fjY* *jªiꬾBۦ*NRZ+	+Zٱ6+=+1rX^e+Y+R~ض녁2>X끩+׻֫ݫ}ѫW|v+ʗ&t-lc!jUN.Ul*Ɩޗvl֪Ċ*}쬅,N*ɖ,ƨ\,©,,vFZ(,x|

m#,,,R-@m֑"Nm>-bmU(1~n0tF]ٚ,
hڲBξ-ͭbmb*n1nbdBfn.v~.膮.閮.ꦮ.붮.Ʈ얮vva*- ܮ.//&./6>/FN/V^/fo.Ϛ~///or/yή/oҒ//B26o/7.[ĥOBpH0gZO`;</0
0
	3	ǰ0pϰo

G0qpƯ'C4qLqooHl1+/gkqoq±q߮cqO/O/oq/!a0q"o7r#B$% K2h2%q 1('1(/2)Wrt&r)2&or%+pr(r*C2(߲.r'r,cq2r.'1/者3'33r/!ga$0
o34k,Ӳ9Org>r9,3&#r40,sq9s032*?<1$;Ds=79s@ct*t5E4B6?.P$2/R;˱*Gs&IDsCG2=Ct@4HF2O@{4Es(t>0SG߱S_1P۴'RtEW{5A?GM3QsP4J4	+2 c=t9o5XqDuW:Tu4˴4u:a5bt^ߴAGS/G+a2?Wdz.76`34;k^od5BS*/H;K\u5Lt1??sKgv-c66E;sggAohZC0?33mK'7NnO4p554*7unsCss_enpm20ǶX1jw477||Spzizq!s1{?1TϷ[o}pXq{'8xW#8Oujo8t88g߰8Ws3aXkۍ#[g{8yǸJ9'/9pjxGO9W>[o9wycIw9999ǹ9׹999?9::':/7:?G:OW:_g:ow:::z:׺:纮::;;'/;8m<;W_;S;d;w;;;;;ǻ;oW@;)gtigx9@\B(BDh.h>
iN*B
$i~
jJjj*k6@kފkk
lKll.l>k,,b::inm~++ҞnnoKoދoop;-Q<-
/p{J6 p_qoq/xr**nİr2Ls6ߌ"3Yr$	html/figures/square.configuration.gif010064400016050000001000000547260717757045100206560ustar00gfergother00002640000003GIF87a;㧓ü.ޡDjH8˯ꗗP(k+孛J~bݍ5p3LчKIb{{{㦒yyy;ZneBqqqoooHо#u^Aggg:ueee%QlŒƹ,z]]]^9I[[[cSSS6qQQQ0jQOKKK(xcIIIaoAAAW???H777`֛555<w趦---+++'䫘F### r!!!sNщ-N*yeA|ݮ5V3~ʺ=ͮ=-\S/|ɦjؤ
e鹩디gؒ7	؅jqĈ44Shޘ~~~>yW0:Uvvvttt1}l٧sSlll[5jjjBfffbbb```hHCXXXlJVVVZԕy[NNNوm꾯FFFDDDWX@@@<<<<´:::K"$u?222^000@((((&&&&EπG\՗
!.氝Oga63nJЅߵޘ&v,;	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
JѣH*]ʴӧPJJիXjʵ׭|KΰfӪ]P*	s86ݻ_+ƹu
<ʕ(WF#Kfjxİđ
ưh'
taAXP80۸cv`Za;{k^\eDMsauSËfmy+ӋXϾq-2}kJA#PĀ 7|ilp߃vtw^0{1)(
H(QLXy
7% *)@i|؛a5i'"=>#僩S&ߒL:	e!X[`y [\teaZ#W#y.oNti$/gp)UZtvr̢z(zIhm*

Z`Fzޤ~>ƺix@b
w}V<&欜vcPyAǴՎz9,^jn3/m뭱S!*2+ڻg{ Q(f|\I
"mJ
E`M:|*ĒJ*Ř򻬹#Y.378h".Iqf4B+r̚[+
$߭
]#0و7$=jZ'6p+Qq aw|(MwDA
jn
7;]/R[ʹm.7I_gzčEܼzT
xt>-˫*gX _2I}

>{՟>q?ݚ:W>KjrO&i<!zKR	\@3 3,l!7(HÄ	B@& RLB-b`BfcpS CEhF;s׽!fJ<!'v2E2:C\bJ&ƅ5G5̉bXюW'-|LU&BnS#D."$k(IDHkߪ!v.KWYC 0cQ,%HH]|`#	@fĤ7u(^ȽhBehv.>a>yN`s/м;iB^\~@ʂ3;'5ԚVa=|~hFhэ4L'N}c["}]Hg#W*m4LWb2ϙz@#4#tR`
u3T3jj̥nөO*R9UFC%խ[;Sph`bXa2kUZWMy^տ23[ڱftHAZX*5+udZh-.2Y-zBpv]jlcT%ep<0MVLJwtw=.3IZWͮvqYt !-o?\nQXSGEtro\_7h,*>/-CƋS~z3*)DKR/w J0c>Q J0~,\k|XdƬ-„9} r%L`[
>
IMu댩̍#r
6` H`BE<d1W	d.q0)Y1fJNG(L[]Y0A|<Hglb.OBYiY;}OV3+AjA3ة'8V=[X\֣H

5^ce	H ѭ@`<nԢLPgv/n>rntVmXx`=C	pݐ<{_WE])WL`	fNswG\')%\+9p=r7 Cܶ1SmPx	QhM	s#pmABXMhnU˅-<Іg?.lfG{Nv ;ldYȸAG1~ }ua~!?<x\L_dYѕ!]>w='<oȀف&W(kbp<I#~TA/Ӵs=|C'8MSXcpEdiur{|z
~~n`r5`E00Q)vvw}pu	|'	؀bQCG npvs\50ka((y}+x悹wQWg~ǀ;XgC|/GLP<31pqUh*x,i
TPw(cx|0@p>G=ց<zX/8
аm&Lh;0*>394 m@PH8[XgXxX'qkf:h،P芯8rL59؍14
p	%a`ȉ8#!6#0Hn	$ُT@	P
t	
)4
'3
P}p̘["GegPd+ْ0)5y瘓-'XMp@
IvW8#	dU0x{Q\ aِc;'g	jIF	oyj7LyOPu\؅@ 30ɘ6Y2iyCmi	M9{YuҗV)n7ٕA
0	)hkyyt-}Y蜢)ӉTكpij )IbꘞY)X@^0"	|YP؃^zVX`ڠi:ٞI'Y!&%%Syz.

P79jJ*yi3LJN$*Iph,~G/[1^bʠd:;=j@ڛ8YzI*up!#j%ڧ~jrXȥ2i1ਐjfhL›칩mʖ
	:
3.$
ɟ'ꧯ	@|^L
Zjzw(T!1 8Ӫ
ʧI~Q	gL;Q::*AZFO(T38Ev8=%ֺ$ɪZvgTʨB9c
物k:DJE^#^-K"	ugVc<]

3;71>:ZyqJsȣ<6:Y[#7eWJYjgVu
3:S?
L=0e<
x۴{K}t c{sOJyIQGg
ۭ9keᚶ!҃>c<E@ۮg*zf
$h@`x[ve+Y&pٹӼR { ۱{׫۩P3w
t#`B`{[髾&JvUm6rEm0CA{mʮq
rU#wٵ<b[EmHW=;Gc	@+1z[z!#Q+<@.4[HL<,rRg#mq^C^<[gܫik̴nZ::ǧHwkM#'r@!HwU40+tGE
暫f|ɜ~tK'¥ˏ(k|\,rF׾,v˻l
ļhL:lmL,Ogzl}̙ڼ$ἰi"ǾG7<.	Y|RjmͶhwƂܼ[g!Gv|$PmQLl<`$t!n4]6ۜVA|g1Ԓ)|j7Ph{ԗ<|"˦o5c/\M
}68֒]6~~Gr
\|GvwT{Q9 nڛOS0Ջ_7M]q<F|GtW,sEcvoU8Lv;}?|%e<й@M
پ=
bM~~fg[ܢM4qdvdK%rw|=#fE͌%g5t2`
,H4>M&nC
p˘C1[|IIZ[dϥ;9sXp
wf16UOf]΂i ָ&(&,/߼YJ5hcd9@TE`5օG~rdwv} |Ϡ@ߪȋ|\>!O75捦8n˄T=5LU]f~}7k=X~̧탌.-P}^d6o^8^snmWF~U,~	hɍ릧ea
T8\6HS==2&]>C
Un>残k&~w][a^-`&fckb,`&g}!UF">hےgH.x=cb!(_q**fCEieOago7=^mm>
[1c_&dD!eHvKf?fg1Vmk~1Lu?Tx5uFhC&hVk>MoT^,C~UE~;[m}g~x?lvjjNFð&v}1˽gn߰xBMTpFVlh!DH <a,njBA",&^d=~ۑQ	u$SL5męSN=}Th͏"\(L܀lɒ+x$2}֥gرCƮkXA3&K#VVL$D At&C&L]X^jRʏw~ZhҥM,pQ	/3mԪW?jz-۱eBxl2p{9+^2
|0tl#1L\D2F˘͗tJݿ_|>6za/˦ͪF*x#..Č0$09n0¬k3Qd3<S=裱FouTKb<ˤJFqg*"I9,mA'@ @<LC(oD!
dt#j/@O?i
bm?<T.@<BRIꖱ2B~r!>jCz  :[B4-;"7,N洳<OtŵW_aB&[$]&+4DY(KOcx	<!uL[N-6\`rΫn+T`x}	x dNX=ּdd4fh=֪SSOEU\[Y\t/+I-qc[g7"Bӗ_E_[	!b	RȃYrʡ(KLlg!DL<ςGQJyn#qDx֓oǜY2ٖ$Q
R{3q&zjz5lpgBFe`=aF
kYno*njp[k7T:?;)Lqlw=oIO^%;ALq!)	s!(}mǽ~='Lg,u),/sJ)kḿ[^5q@3QL1x
~ai%E)
!.yؼ;<H%%HrD||L1F20+@C6gc!Wm+Ic@qG4#'sQH839+`E(4"Cc(hFR
|C	+#y4N|HD#B$@E4Br;BȲuF A$'	|e|rFoX@iG)	)t(2"G[&%F~@X.bfF82Er#`BXn|Rռ<RmVF(8t(:D$|fN@D&s#3rtB*PI|AƍQӚ4D6U>ƀjTga3R?nĜR9:ѥ
2d*Ο@rd@:4H#
]8հjb]|"F@*q<)X/A2D$"Z
t#Tu2W5v~(`C.h1\7&x"L8,;1ְ"#X5+E;
H-H8ֵ:@Jz֨moq׾?)n~1#韢Փt+"Z{FqpnxYFc+zy*[浽}en*X·G7p_	/qk*?ӀۙY[wUQir펂lxo:nm^v ~QG<X)(fb2$gvM>Qcn8-QZ(ȻdK5&YZ=>'7ʯݰO;<6Z,Oe(siNw'1}=2A<oׂG֧:tCЄ;eV{_\I@2N7{	9\~tNa2;3odVsaDVVn{uKb3texu	s>peۢM@2n07n(:-P,×]wI&`/8C
p.umkN8n
{"7n!_S#`+j7OI!(|>*R/N^8p#ETMraG^3:4`'&4!RF@{hYDoom~.9NHuq)"tA6(}݆5xyVD[>˛Ef .y6~;7zbUxχ]rZgDD&G؀ܯ-à;.:4S@0@@+!$ib]
@[u,9U񓻦ppPݸ4ԠA$M?S!D{:GK1ҤMjx6@ܱ&뾯@ AA#	HQY	i
H$$,ܿvCEs3jh&h5R[BCDD¦QL+?-%.D0Aû+Cr4TCg&Nj&95A_:y3P@Cx+xIaąE>@*IćLŒ)DӺ"ك1_LCHpgUd{6ê36|xKx?ƹ	~4F)dG\H4HBh̊HjĊƇD3õ9<<èAYB;6}GǙ"Z,%*4RSȢy1	0p;`+;UC,9{7kɏ^D˴4c$"?ȆeJ"FЙ:y823:Jt[WƣbJd},}Id#*)eɼ̀KL$;OKLM;@J8Icv0Gʼ}dt|K,ͺ$?ID$Kd	@:AsEJ4N( OZXK!lM-<ЙuΓ`#PFƧ Ou,ì|OGOXY`u֋N$PhXv"kPOuLGAFœ4>xɢ-U^q0QϬ#!=R
Tl4ØiRA?T)XEe!/IT2ϛlK4e6'Y19νH7x(MV-10ɭ<DRF6zzTHa%VKeUVQFيP 5J#뮯H2
O!˸vAVdOn=
Q
EUU`bW0(tL3
NmVC9
S"	lEUGL)z8T)MSt?A`<wT0QyW?yٙ׏WLNU $91=?
S$>65X ՈUZ-٩Kw(ח5WYY3eD7}"@8D2<E=XL@$pگ9U
s4<aHmH&]̕y%[aM؆~e[}ۧqV%[Qu1d։!8!^}"
(*\\UE/eWxxwٵm=p{VZ*]" ҇[><8%^ڇB2""ލF%$Ͻa	^<mxߛ5_	BP]$I鍡M(EZ>V̓>_hU
S,N蝌x^r	Fb(
cW{FH]MklTJ`h>xa߇X54EN, ^ϱ^#@{X]y!9).	9-	:T_)cd5΃PC\؏7 $Scta>c[^B	3)>Mp|dTЅ5K	L&ȃdPfPW%CiW&Εe͞8ufvIUdzZ=fqGnP91ª2f5hQ}`
pvc g8	P0t~vSx+yF_7g&g}K0deƈPNh@Rf!5G
*hM(8ΑeԸsFQi+xM䙾`xR1X)!<~~tHzu&RijN*~mf	h뿐QPZ&n8X)$mjڶmòz@Tbay~K	5Kk
y	ymDZFa`K8m 6$UQӴ#.Fɪ7ˉO
0)N>6EH~9'&
z8:I[0'L(qXoɚTq6mb
\X/O 2[pcA1-ɘmR6sa~؛QҘ7LV!q&o*+lo0D"s36{•MM~2
:x%?aAˁ	Ozfu5I q?9mSHpKNGM$Lcq>a6U(y,	ITe	Ԟ;X_"wua۽"(0h{|>XH	m>F
V':G	̱E
rwPtoslQyρ5z|Wy@8hxk, 
csx- ~u9؁g\S({t\逮/7ʀBPoPFd'W'/wDHz3gzH.pz`5CH#`G,LWs2GƒbaPo+S8E{?ķ:/Dlm|/FoouI\y"
w5#)֠HXp}x&U~&z}%1~l؆m0pXd+h „
rka3j4h	HXłh$ć,\aM%ʘ2cbwI[ϐ%0	s!РB
z&)^١J &8GɄI S9;dj,ڴ)mV-ܸr	#F۶13_"ʕ*E r ds(E9zt'7$aT%陪c&3vB6G.m4qXcpE+W`Œ}63Pn]:BQ{7/}<xpcÈ3~v#N9Ǝn<gZt,dZK/v k%Sm%
醔RL9
II"!WaUs0#!BYb-]4ug^zePyc&ZcA6`7cBqs}~L =
&L %k4|32aorxV$.wbC
HV'9(Zjw9PyUAafTH"]rB@&m
Dgۚiۛq(bʙ\*y((lB]H{(wTԐT
ARԤfu&%k%%UvZvyɫ.0jkoo)'ɕI
`.tX|1CEvAwU^Tuw٦Bi

$[D3vKef'1fZ9yBGqa5$YL3{r]iU2ʚ,ٌj:sk}F׊+N'l
qX\^{9ˀv\ܠɠnS};4v㭷jG LMt`1x~+t*|'Gl9k  9xϢˈئS#U&!=Fit;c
7X	d
!hXش+]q҃F5eo8&<cotda2o~-[ҕ?]i2pxs@9h˕w_]0jx 89‐	/8C
O(FP:S
w>I+:4L
FpaD!.(LEZx
$*xL4&AAP[W[L1@|R#B)Q:0Be؉c^&7;OR>ƀ>ZArC8<'&
I==z0.y(Dpp\QSk%:;~0K ΄"j
/a_,8?RPS@(B8E.y4#7,ZfـaEK@ԹNTѝx<EXm%?cBr	% 	P`00(t}D̦a4X^5'I"H
8+IyRA0!ZK	v);kZ>B'v;g*AWcT"4IJ FPF
)7qUfFR`WQ,ZNIMctX[5Ҷ|r{Wuu_])Lg
+\"\X"0!d%;Yբgm)R5Sq#:͍6Ex/|B״)C~v;3w2}ˈ[:+QΎ\^̄Ȑu/|YԒMVȧwb*i4bK1N_?Kp;\Mv0.wv$½Q5\PN"
"l"y;Eh=hIRf=G6,6\&;NnRzemTsw: cB3ekF/EcO{a' =׈!N4bGfd3q4%=-Iy#qFF1!rzØRpPa
<Dh^F^4~k[{&qW(F}-hbȎ18#K6ħpǴjFS7H@A&'Ϊ3UXܼxoS$e9!\tn
~pҰLF~m  6Ydlg$^;/LD04]U)gYnEsyb<kv; />>o3}vdlܒnq|B?24vtcU݋hvj3/c(|\؁|\D~ˆ!wCdAHvŢ2!K_6-57d<1EӿEuw<^!1M7<JUq\pCy^u_NgV}qܩbԟoт0!_F8ރA5: OP_`z[ďD=Ny[˕ @D= 
:Jmɂ` `* 56@B B&my(pƝ	ݺ=dFjU
ԀaDN5:.`!; :`je]J4y8V"Ag	C]d"	JTܡ`,|bL#9#]ɀb*޹+D,ޡ
 --FE]/B3/"ա@i]8."8rCpDa2Ra=@7UM%@U56
a2yxc"J$K+c:;D<<EN\?#@5)$L؂
>b@$`P]$fueH5@Gf#$8J\>+K:ΤMd,"NOD@rbQ3\%$@* C@aTBTk|#6VEf7@eYipG	$Id%JJ+B/'@[%3(95\1s%L*e_;4,PE&.et#c3@X!B*1BDp0A'gVa=-hBw}Ij~'k_Z"Z"	 283mnoCpq"L44B#hs]ƤJtDu;uRvJaN(|gxނxgMt1'Y^!D`: A8J(cEwuj	YvH$$(,(2Bhnoeplj
@se
h~cchj(;,-6&yj܅db{iC`BAA|1gj)`[djT`i vlf3(C24mVpir"D#Lr^)Bisi%j7&X6*~JƍBzbBJrCTpjD@8"}:}P L P``d2ĦxtjFƥpfhvB+J)+ʩ.8kߤ^ZH*\(@g02h[IX&`J%뽾ƽA*cFvWӄYBG0Dl+Lli@r
+N5Ìޚll]Ɓ &遤F9,F9eBDl*+^E%k`4E1QIQE
pC]"b"'pBl:(ņ)29mİ
r5@	"	Lo2-ƐRZbN,nyb6O^-A2A% .`FVUl'zbʮseE..ĖV3Dh"grA$B"0C;H	@lf.rj,dwFBB  =c	D%įʯ"|^R_\D
P@D*sMs-0\%\m6&"­l2	k'xB
p)ǰU0
cPko@1њĻ ^op&HL177nQdZm1.n.1'9L@#ҭ	K& 0,ߚUփ"
>&cg .fX@P'JD'<w(:)UB-@p-%;O3'tnrB/@\1LN?o	Brtx&<s 45_3`<D#?
UIv
k	BA'5=-4d 0i*7$aItǎDEG+Gp/CsBLj4Gg53ۆuHC3IIW5JtvZ]tŴL7x2	Z#͝Ļ;D/=	̏z85V,.^l2uV;0't./F2BOFtZHGuvE)4Dzm^^su6ʤa˰&cBO'vA
5dc&4TvC`6Xg\6kA0rBA4YwG˅%Xkv[4	v|rf646	6ean/4bD)?75d&4advDbY7{/8{[w|H׷}LJPnw_6dew+_8Nx<
Z$	tAAcOxdx&R~yw\xV:C0ıZd@[8l'x
(76kki$85D(7370Q?y^R#!Ac9.XtA@0.DoZ:\Eu9|9H<"kiyo%yqXƢtO#SCw.E/:ȤPXn0EkzAL58愞阣P#-[8!xP$/纮gr&rA$zX8H9Q*&UYxoqz00LCz@0d;𦭙%ń(Ar{oŻM˝cT
AH;'{z{|a|LwhCc(/05(B@Wk{^lg5 t;ȋ6`s^9<Rv;tK=;IxA$"jq)7FO@	0ԇ/g}ofrtW[cXEոA}dHHAĿl~CDlPUE_pj;+ݞ僁:擩f{>/P0B	>$x<%m
$E_~]~_̻kG=@@ nb"[C!:dnFԸQ7nu#3Se˖ڵcLsJvm1b5rhbJ(jL`rPժʔ9k`A^8q
0:zrɒQ[ŅBkջo_2Kh%XLclE6c
11#ԜbFW\t8MdL'SZu`(Fpȝ;F	$A
3r̍E‘oAP%GZ%̚7qgP,5:9=t4TVj5Xd]-q.,kFfˢ0f01l"f2*,3@E>-8PK:nd6tK77-!kh.
@暻71%v'J<b+fҡ)ZrF/r[K? iQ=
+	t<,$dB$24Ɖ16M4nJ2!R[>z1nm 1LN
!!58X#d!E'+ʧ.aZ2:=,sʁS-@`:݂+@PM)؝O@eEt
/lC4ZX0ೀdKHWEFVw#Y}QIAtU:`eb=<C<giʹ]@ndɐpťrIZcn@tzStQ54c/A2`0S]ZXRk8ic%4Ncs}Fd'U&;*j.[Y1c/Ѽ
VۖqύƉы)ivW^^kq("tnT]҇0nFao$nM$2r×uYšmq\rgĩoU"}弭s_t'J_tw5uZc!wc֐Qw6
ۈWhD8Ҽ5ޓ\,]*[Iǥx{
_afV8g#.100EtK	!RTY`Cn"&w͍e0ؠDAP#	pA-
W p0
DC0PL2{
b?TBшHA]O4B7ENԤƺ_Fu2m hT#FWqnC8<pd~<$yW1.,3!_PҒ껜4"g
;UybU?e>&DH<A1̌IUL`fB۬@@zlf	hJSۋvHqJ@4gUtjDB Ug=pT.a?:@M'6^p%^&

јhGAP&@.^zJoGrEv(@f:JTCNwNZuw ; LRYE~stcU
2^jXq9GLҭ$u\ɐ|Lb346Y'ЂW΂tG,FveM1lWu+ڴ=mX
⣋~0ikӚo+1ȐNbE.T@xDPjHB
a\st@/d .dJTeډO\FmWb"28wp-8n#<
_8Mn+rv">,7c=ͯHYbX=ūJ5Yǣ}h, ˗I\}]24kdVF`Kưy}(ѹpu߼fw1Q|SRժ6FZwĨrMȍޣ't3eNo^氨LR95`VլuesH5k^GDQkl>6
ñE#(
R{S5Nsso
=܇^JQS\v8˹uN~r}UۆbV9?8Cl&y+~mL_yZt7܏[{9s)_)Zꗿγ}w
}spC''A:&O<֦3w\apȽu ɞr|jue>k99<r*TyU^~|8R~tm^c\V縷+?jq{K^G7{cnǛִpAwSN>8<x6:Ⰽ4۰.ԶnB:< oH
ܬ@0jT|g|7گlK  /">BO0/۪n-L@A!P>Bo.\:BETLQ
h%0F#\kzPo
0ܒN2	-
pH60doPxc
u
N
#Bℰ'
:.2	0=`
Xa%)aj?Eq LQPQ@-)n0@nD@|)A+/	#Bq:l![P4|(PQaPO⦭zf<N.|q
O u !B6l!
L")r)"#Ȗ##OEkQM1~Js\r.`~Q&&&M`''{'MP!ro)! 05B$whQ	CtXsȲ,2-q-4 4N(f/q4(20ms0Sqo#/3+P2$O/hdh\3;S-14'4E6"52!Ys&# !20)vs/$p8$+1,AةFh:-3i2
3ACK8'T;1k!$<<!)${/~3>2۱$S%٧E<I3@r@=3;@AtAAS5#T'ю/46ʳCDpDۓ2#>[+0	[ԩFoTh6\G4NAN#b!fUJCӓ4=K/N$St$2-F;FcMuBNE4#`A44r6tPP-27T#yI0StE4%0FʬTSssp9t.FuZt4bTQU;1B6ZbU$FBJ)ˎHTWWWّ$uR+9-U/2MYMӴSsZ
Z{$F%!5y.U5$7O`=B{K5R'8s1?//a	,`Yt~6gIu#X"`ts\b?c"r*C1ϑ1dU^%2,Wv%ܡk[efKnf3l?EgVHkw69nh;1W2=%n19j}SjQTd>2vqe0l_Qrٖ8C8֢GvbnoDo##1!u+Eve6Y1s}7As#Fna%<ol$s0qb`TDu>p_8Sv5	kqowUwɶ~|3Dg;w#yiA&oMIG9
F5zz[W8ERu}wqr`S
}xRws%7`UCcyIIw5W
Qw>^6eal5fm8s?d3b8xB48J~CAxFEVCV^uR{Ô*`8q7rᆹ؂#Ce{x"uyͳh1EfOP+UXe_X뺸B0!yVqpy	UyAlrE88jOq7vxFۆz9յP#w@%paw{R
9@9T8FKdBhz>_Vevm(_@5nFiOÑF]XjL8_88!7rLϴF?SM;Z%ϒ@434Es
 Q7;0Tjn
rMv
Ti4k)hH(QjF_R"eaɁ
\
P (D!XctKx%5Y]Xkv+hsN4%y@Y&g1qɮ-lۮ%+
((eWu
('B%_2dCN:U_

f:_~#KubwקUh{:[A,99YYF9s;@M'pOٮ[̡aJڔ*YI߅E	vŤ#[ aAuز/yTDh9c7NLqZڵ٪?ٶrҫqú	ZZ͌[N뭹+.{A[uQEɻ{{s:G1?EA'x
Xe9<S|6?ܪg³:'+\u
y-
'qcmλ&ڹzZȯi<
Eq3d;ܼ<(}RjZyYŨ~wK؜<Xf<zSc<@:qAZךeͭO<{-Y<]|ag}B7$}%])=aR$ӱ963{S(%IԲ\S}ixYͼ?c5ׅ[||搛dU\bƫGBtҽݥ
]aܹ%VθLjuEݕXޏ]W][;̩f|Go/3y]?|:=ŗϛ=ݼ\<ޣ%}IMQ~|_=g^sC*}{ިIrއ^r_	%s}w
;<30N|⹫;Wܢ}	Ujf
~Sޱ~Uck2WKY؎wݩ163{ԟ1{]庲ha?eЩ^Œ4ь;8BrlyMY\.19#L\	 JZt	,̙4kڼ3L2\'1bd7iҪUrP㇨DVM6lE8qv
5˗/U|7ܹtڽ7޽|J)|دb=u5ѤK>:լ[~
;ٴkg]:լ[~]𘏱1("''PBESRZŪWbɚE-ܻ{1eËKF^y9f監{:Y`quTy&]AfdY\fq&gՉ]naqNv1e]֜fu6h֝eb6ވM1^29֕8}1^cJ.	 ubX!uRne`y^|.RhØjfn	grIgvމgzg~	hJhh.h>
iNJi^;Zx
$*xL4&AAP[W[L1@|html/figures/star.configuration.gif010064400016050000001000000610470717757045100203210ustar00gfergother00002640000003GIF87a.q<̬l
\D8˯ꙙk+LJX ~b5zNpڅLчKЁpAb;ZnqqqHоmmm^AR:ulQҌiaaaH___]]]I[[[cYYYj9WWWUUUSSSqQQQ0jQ(xc֮o8???===H777`֛555@333<w///d1---+++ͽ'HPskNщ-FN*yeנA΃Y|5V3~ʺ^)ǵ=\SҪ/|ɦj؂߇`@!s}Qgؒ\qĈ44Shp@|||>y_xxx:UӐttt1}l٧ϿjjjBwhhhfffdddbbbhHCZԖs®PPP`+NNNfLLLJJJɷFFFDDDWBBBX@@@:::$uƳ?^⼦***((((&&&&EπGd"""\՗ïOah53nJЅ&vǛy,.q	H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@
JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ	ڷp]vݻxΚUaGLpL*ʲ`Ð#KH
L_$,ɠCX2̘,;$	ƶuG˞=GC O1힪`eУ#8Lj{']-HmCWӫ_{x* uihZldSxQ!!(pĄp8ހhxp v	.x01Ai(bI8X}
V."8e!(:F)Phx
\e5G'#MZdL6BOW%[r%IƸdfb3))5ap(ArIŝa*9#g
"Zt:e_xg^*=p*򌧠)*yꗑ9)~Zz
6+7؊롺I}Bgd:YɦΖKh8V@+&ʫ>j2ǾG{+Z;'j>oq0p›ێioN/`O5llqq(K	pvp,K/@+(B',lds,,8>;%z2)14jPtPx$`Bna]н밤HoL@zGDyw22ݰь˄C*?,HsV+>‰j~x}en!G"\C<!P^tC0w"KD:[r*OHaqQG`|,3+yhRB(EEvLT	TL"tDpuZl!	%A5(TBv!P
* 
8#կafDd6.dcmmgZtŢ#(j 1Xy$QZA&=vu~_42ŽF.rHFR(ke.xHcyCb ?JUO_$h1,R'ƯҘm90qE=3=͙&Kjr1	mr6'	ɑpH%wβ=~T[vpR(8IB|Zt&mKD#Oc41dAM3_
u("%zD&0mIK7*Q_v4$F%JAGY\aLyBEktiLͅ?:BT$b,(8:J"2H%X+Զĩ$:6
psfGjV9dԛe'ZӪV"+8FOtvfhG;XȦYRJd)kl'@G|Iop
C5+YAԣt3"6"y͊q00:ܙ:0.Q[6M=KߊTWx`뻺n/y}z%^q󽭍/[
CD]jEl:lHYJH3VgEC<tjn+GF/}AR>x|J*'mo>{?`A[,05y)l:Ó@c/bY9<󬉅J'2D	LO(aB֬*yKĐE,RCWK9	hEiM[ϓ@<Jm	=U"8OZuHuuk*6A	b	NvDPSU7;8hHnn߮rgA	.wM<64^	]1Y|ߗK.p7.@p?qGѲ<u,$,@BZ:W(T Op_B***ك8jys8DȍnmHAh_]hTuw<ABl/D35Ɲ'=m;]uD9kw;Fox'~pe(t
dE6d߳	|_O_a<zG!oc79l{	/ ~;1tH?"(P̨"Q?1?{_ϱ	E>}1<]|x~-MkĔpDW_GvwP~w|*p!h	x!ǀ$ 
0X
[wk|w%y'}(+ȂI}0(
2HwҕIv
@BZCH),xD}P0PvPVRHp
mGȀcX
eL}O؆;hHF6(mEq(A%ew(/8pSXp@
\xDp!
Ȋ0{`;@gy`(
$xxOm
ݐph茵H
GWI刼؋8؍8@w=^H(`܈ȏɨ،ψIw/'p0L3L9yr8H(YQE$AH),ْ瘎5iD{X
U
@BDDYFIBLٔEB8UyC	\ɕYbdIpp
IXH
T]VItt斞q	s`4zɗkiWɘkHhKd!81)9Q	z2Y.uayY)&g(XI	IiIi8	ei&eIly,ƹ؝0Yi)4Esڦk\Ay	)IIYxcQgG剐ҹm5ٞy
:y	*ʟZo*a<Y"#J9h
9kr2:4ڡy~8:<mBʜDjHjo?'t.
ٖWY[꒎i_
Attڟo})u
j sZvzH0	{٧@ڢĄ*tDY0lXq!s*z>ʁzj،J:Izt*tVJ:`Q`:ˀ~z
`:`fzDJJBh1q0Z/
0Qʙ
*&ڤڂ?Gx}*Jjb1=LE\(8ؑ	^

*){}ͺFٱ
 +=Pa/1+Jk`{
&<
WړꪱKa20vPVzݐZ;p8~>
`yjvPwvi׀nڶo8
q!j;Cz˷^P:Z;땆
nQOd[v}hjUqlй;*h,"v@+e[4QOJiؾě˒ ˼rC"-b$RKK ˽詃{k븃j˄A˪jRqyKQ\2$Gr
[5p	1V<3ˁPiW;;P
K
ɱ%|DF&* Îs@6{k9r>@[;gmQ{OR}ۂxE"A!+aܼk*f8oq
70Qv<ĔZPǰELǀzŢЇLD
KM<Mɒ;5ɨ; k`V@a܋%}߰F˲x}h2h܆kdGB#*7@ƌ_L<||͡|l@ؼRb<gbXe8~κkȇ\GJ&,kpϑϓ–L\i\p<
m
4
Ѻx
0dη_
XiK)+/]14L9	AM0DFHN0v;~Ȅhf%}Vk[]b,elƞt o1
ZBVfK}rĊ̐K҉
iW{_b]d=КlЬ>֝LP
=ڂ{HB[ڮO|r-GtVP޷0"Տ
3-LϜҼMP"SAڟHd@ht\~JJ(χդWLHpL
00c]ߕ]<?еUss!Q`j@aryDILZQjTnl	Y
/GpЗi3yU9P
w?H	^e_wڭ}}݀=%)
QN'aXc:P`b̓]7mƭkÕ`_t^/r Ă΁
%)q^ފNV$n<ȣ<oP).Ә^eh~jܣ>v[.p`qIQ8s04̌^c@>%dnӕӗܜ-:
?CC~؞YKS+H.D俐*q@!@sc쒭}"@QG

;*KsպKJOpB#CBۖMٛh2ByFr$urJ^+
KPWHhm6U]뺞MfOBUB1`$/>f0֟MD9V8_/kp
wy~9UrNwzXcvDm(^N,-S:q՟_Oܻ@Y.Tcn~[$J4oxϯяHO~ld@q-NyeEĚCπh"=45Tiw
W"ec%{9	ݓW8k1$ƹgng.48SN)\r=]TU^ŚUV]~VXe͞Ekܾ.uZjԨlirID J\ʕ-_Ɯ3۬|}Z.l0Ċ3n1Ȓ$O\e̙5ogСE9DmT`>]tխ_u>3>㦒#s_~|V/%WyC2t"(#8$j
%Xr	&h	'x	(BN9a/F$DOD1co
<03,so~2ȷ/19
@l@A*n{P7	{8j)ǔ3T1M5dMY=ɐ1<Zy-{FHAcLB<-z/5Y+5e[A,s7
P8$1EBMUWeUWWdK3hf9U<?%4Xa7/Q3?z=I	tM!mB,Χ)cUsE7]w}V10?aWRdASVQJ	p5h^Ppl5oC{T=KU]G&ؕ^qF
_egt9"b~[ucq?/dk6Q~&{.b96|	E9e낲Ri鈡 <i[CWǨƷL#9/<s&f"m`F=n]j.Ce^wޗA!q-=mcq)r͟>zl]{/umabCOk)?W~^Nݘ_V<Ѐ
@62J׽UpPS>:g]]6-p_
_C<7K697ġ֒ЇAQ:BXЈ 8FA<|KXB
~8	_-"-T\#`Ұ6a519XpD:)|PDQHYD@"ybsq3f9kd&EfNvғR8OP'?.ɏ]ȃR8A<B.uHpT1$%+iriҘT1Lfҙ63(7&t~|e0Y*}d	C2yRhIyI'1	LzDHg>L~rKQ:„<Қ&>@{#HIs)")a*%9RREgJ~ԎIT4mԦ\hPz).,0 &AΝgLB+O5&b#TժWKSTU6ԃaO.$)z&XRi$RUYjY0Xdjb/UdU(YJ<#vh]	*hV0\kjuV,mZ-mUʅV]:|qٴ.L R63ІV@C^TV7sYmm[Bv׻Wm[*\y2p,UtW2$qQux
]ֺ\x/ڮFpV,^RlF|9ozB}
F0!'tQ`k!V0cx+/f,
p.\Y_EvO#&aN-Ʋp̝__BW`
T Crp|$k/`MN)׊ôX+eBj̅V|hF7:;%ǨEld:Npg8cVhV?1x0kZ:,?
P|LWutv=ꨴ>u;
&ub\kn`,εx*NQiCUpaCIt_e3[)F'
j7Z/=qSw]tQ~7i4ȷ]m9
'Tyr,(_f;(U6uta0U$7yҿ
:EOz[fIRq{7g{ԢEh+fi?70u1N"^Vl]/a<E5nU򳍻3MahpC:	fhHD
zᯁ@Q'KJ)A6	0W% @~~5LӻN'	Lŷ	iB_~r1BW=Hrm:k=>>#R3*k~4s;#|H7p3fD@f|8@K@
<<8x@	d
==k}@k|01ADpmpA>mZ؅NBA!3=s듬%T3'$(l)3$DCH'廅rC3$*AL,6=7BR8$c<ph3+BD*HiHm؅VlEXAk{CM%D4;PdQ%K,C@~V\>'[\|&K4<M\29,PKXFTl{gF|>@xm%n=op_CB<3t|"Q8lGB{QFZ(=Cm<ChDLJ\8n `HE1)Hs\X†d14*]HH0fH[it*S,Ep<I3!XPlt<Qh?.tF#cIZDl>tHʓIc$ɀJJuJ	JfBKr@0,CpiȁKMȁsSLH`K8T)G+\ddLTKYLfCDJ[pь̾*Ԕʩ,3+'JdH۴6t/ߌ11[0N4M(.~D E$Gc4DL\T6V#Oa1O$@@Z,,A<3OπPgCM,IHuM=PYBMc04	xPOA
BԄ7xQӮE-olQwJҪQJ-k; R"7@R2BC$A'؃3R)OpΗ{S<^N}@`NE4?ʁ'Z23]PY
65C89S}@GI0!>@A*ORq(-BFm)2B8HLӼҫBM*8դU0UTuUeUWUYU[(UBUm}R.D84hPלQԨԢ&XyHlAV:UmWYU?=WAUWD3ц#KaeymԒRI=}Wh%Ei
Oe0LXaՅ7wMU׊-W)6^d8Y|@9eږDSɒ#y`S8pXr[EWvM8%AɑZN*@qUS& [-Q@[pqXs=Z]8FSڭ=yZ|E2؄܀'L	&"."р
\5ڻ5AQR^A׵T؍]]0zwjM "'Y,R"Uޙ`ޮ[-ZX~ޥw)^k]^eYٵ
S)v2+&Y#KUqq*\(B_
_ U]یMW9``Z`,
V\u`
3haYrZmRFhxSZ%]ꅛeu]=\%b-hh`ݳEL( _#	%Җ
&c8p
S2^Qcat7㧕_
^ch3n6@~(B. "
GHމIΊ!=UM^ᣭP_]`SaKVP#65h
.A]J9Idk	,1fAf OLn
`>="j
-lFTfo.#>hmMʡRQ^FLga^mgQ竀NfM>WR"h1c8hf]fe5u6Sh}c&&ZAhBbuyw!*igGΐHiHව~f6Z~iXśQ{Z'0T		zTj^צ~Ih究ސ
6تEkP^$pk
PWN\|#:%T'hj)&Hyg&z6~J(c/
lzefmҎkBmK;Qv@Ι7egVi¶bMQ쒆d>
En%nJcnoPf mIȃ<^i3%J(~xmz{o 
@8`K	Hp:pΨ
DHke͑~xk-1Lje]@Hmb_i_nPRIq5pq"UEp*r5h&I`g`kf
=`Io+_,'0o@y%3(HˈQ'R7
 }[֠v_\r?g\AʦpMD|`(D,q>Hm0&U(x`!5upop;TǼŠW;Ӗ=Wr
c_(0OO|`#xQ#1lܶO//WvkeX!Fb
cw$wU3Jwoy#PYt&w*kzwC`GR@Y(@/ۖjfWx/'h?˥E:'&UnjWÏ?	
t#5]6_<
=O G_[,yCrt'fFj1y1^EBClvʷ<)+mcwV/{iv6z>x~ȑ{UrҢeGf_oxKg%%zpop~a\Z\
zCsD? @y#}W$-"pG_wvJWz. z".B2d+
۱
2l!Ĉ'Rh"Ɔ
6r#Ȑ"G,i$ʔb7*ɑ#cڢ\:w+gc@	*XL QRz/Qն5NibJSiH/ZUQEq!VD9X&rCSCqx%,R9=f%LGS=yͽFx#KMb{{V~B@$}bCM)k/nʗ3G92;,kܩ^OEiAPZmU|`s>JɬT)6q/{W`vXb5XdYfqhfjlf(x8#5Vd9=5֝vy817^yI-eTzOEXauHX#!W86iHq2] _~&a!cA&efYg6ZiZk6[mȢ?"Zzq:jj@zRK
bN-$PM%8MTΧXzD?)&j&頝I!^"&Z"(>ʄ:Q)P{dD
``,?dSpS
Ru+~C@ug
`9	톂zXh艎*w};.-WJ1,5?.ļ$]L<[QNڊniD49FֳNLwJg}Zg
#*jb$N,%uۍ"ywB4Cw~I Eސ
Tѯ[KN+
Z9:Y^q2uj6!-mM_Xݽ#3l(t=G'm9GݐPMZ5ӂVPQ໎<-o$ЀƯlE[LA9M%n\ū'H9)xbcUkʘ*C}mO*xHE?*Leć/!щNPh3.Nzy0haI+k
'LY="PY[eXpgNZ5\CN'kHQ	& H(Qibep	Zh HD
fxX8A
zPUXΨL>ViwsO,W7C@@A=v6@J)$YD.	ݎG6sLL ҩΉ`=)N:!3rR! NLVd20<sJ.Fw>Az\d@^p
tN3d4hHB,	=޼g `P) zFCEIQL#<9{ꓟIA"@$%*)L
U`j˂xP\*,Z_>|#6*:B$*`
4v!bR8f86$f3Cj.Tp4nTy	c rBà>.bzu̢AZ*PeC˷Y]@qSp`xxeҤVaZ
{,dHDD+v-FFܐ0D:܀@5H0ʱDv̠.:[ moܱ5$	
saQ&*u]}w3e =nfd<1Ae"84x>6x PH
ʌ1#Ŀ
XKrE	rX̽O:Ѕ	֭]w&+6[A%Y:6g'/2SH6L_r.w5]eh 3
:[9B@0])Bg8_UE[Am<GBACjl8:Hpl(8ĨKdTZՎe\]ʴfTrC0A*|Y[ivwqxj"w6C@hG;{Y2W	kqg
*'nuO.-=au8.+5OG&_d_
4ಾf<&ļ`5&9T\")%yopBwC['ﳟ+
/63s9tU}Nw!jw%ַ*T{?pN:
>k,[G4biZ#p4XOڳ	>򾛜ڀjuX
p1_|!!L@^y&0AEwLD2]ple=N`qY,EՙuSl13-4T9C(F]MyDHq!_P/(DuT,MN[$A+L"R!cY,(59KN`X ވ
l;y -00T?Y9h-0kiB'M
 >`
LYJ:Qぃ-'!"!}AX^aNTTO y~aW`!2`}}Aeހ؃)*]U킚ku!z
# #Q
D\"&
!PlB(("!uM(CI-.B.v3C/!, ]H#]6c83&\>Uㄕu9j5X<qc')@8c9G:cebA\<vb'#>:>c^B/!PBve+4C.
D6/Vda1R &Ȅ=d*tdIA ܖK&Xj9L&Md#NTQ^%ͭ;0D#gv0:F9:RUVWl.WVXFDE
VF1z2$3/p@,e^_dmYjS(M2fcAL&eYe@Q*)g)cS
dN,ArakA4&,XA8&Y&Z#F#pg3%]%ss@B<VKږu$La#@w.&x
Ny>y2^C
(`f{&D#h(BZ~]{O8FC(m:M YREaFWGVh\g.g,HtD$5maX!V̀z'/@BhΘvJzۏj"fB#\ꥆ&}(C'G;j4,@.:Yp&fYej)2drfmoi<Щ\> #$i茚B(I,dhڌEUNcbfBB4|njZe	%@)Ppe4j;誮ZK>*2>o&EpNq!3A2
 k(+ZBRbr~+/+Kk4>!1h+bLӶ̦;,H™OA¬.B(*)2dW!BXv)>kNk^kn+,(0>QD$)f&C-mM&mA'6^Z
D+|I5vjZ:,[i"*r2x
Y!@õ准m-*t+rdR:nA@,zorlE5L@4@-ܟ]wPA*Ʈo.GG^&'~~]aiR-mnM^#80ށ	sPxo1\nz/ST|o."G;X%f8/Z*V R,k*̯}^]ABIFΩR0ߦ߲ln0t*!.D|~&io|p0q`[]%0v)-i.[n"g*Um~bqOrp^CGxx.qqtEVTC;.
rqr!E]P^6ho&10&]@8O+(/ofv
+T9r-+ZrX(8- [2c6HE+&,#[3q%khB
ox,QG<7.ų3-5(@>>G?r4UdBm tFDPDOtB3N45GE)r9CpJt)tCJ+;K=/LfMt'A4TCUn
Z*zmSOsVpN,%?qFJ
`q0j(lqNpW[WbXW/KSYrL&)Bb?˰?5]4A5E?ڄSjFt47,E#
frn(ddV(Be(k6r:n/luJ6Ltj6FCk[/B416F8!|B`/76T'qc4U/w!9IxGt,:rI;s,k/=6yÁyGwΆ{{UTC7}[D0!6pv>,D,^qp]L!804',yKeSurv3*heZlxKw8Z6)Pixwܱt[vmƸDXxv:5$7bg3IPd&l’sB?xvr&a9:wZ9)!$
7ԙyU#9Oܔ
!x6$yT;qHO<iW%\B& 3'85Hy:.g6xu9o:\!EŒz
!;Vy\Bg^J%TB{/z?HÔ-M;FT%jzLkw{|;AN;S8Osĺ0Ճ(A;nxRB+GAr<P%;;3;9u?z*E0izoKv
lLI]ùwDPSl@H3AEξPpH{<+$>w_K6{:	),Cţ/k<7kbg׿M#cT`/
5ǘQH6*D@}=;8xw/=sz ~A0NNϊUl|^G>DL~Dڤ>^>a|2}J54?>{3:(ԾH}Ev9/>@8`APÆڵc1fԸcGA9ām|!B劙@\EFd{",)pG-W=yc=qTy&WirIsy,E$A2`Р"H@R%.eʴi'N(v<paÇ'Vh!wܘreˍ'VHB$wZvm?!E*Zka$I&T3KwX>,dǑ'hr
<L|sf͛9u*Q^%S^%ͯa_6[9F
Բu6ܺҋ/&d<!06F+Tc-@6*-3J D3bNQQk	&l'n9^2JP0O*ȦKX,>(O.0/
P9{GSOf@46찵A|MDpMTT1Vy1)SMQd <\RȮ#`'#<=/s>3X3[+M5K8V7Sk?tA5D	YDpLt4$B-I+q>{9
R*<-[%&g=aa!z}/,1!#5Y4݂kͺ ە-VSkYS[n\R[mC}-suCQbVVRKY”^|O}!<T΃O^2șZ=e08#P+F㗄tFB<YTv?)INO;aN<-YCy>~ B+]hGyeTިYt6dXOF:뮿DiUznS"ђ=XHX
)Do?ydplq2=[Ory^6FO)tQϴm4O#]O.cYMȦ!,¼yFAz[ߎdw7Aڵ>B}:Ε.
]xS]j^#fĀL'&uX=lA=CW@qջ
S5dmDC?8٠v>Ј#
퇐6.rA"YĦ5cPduP4<539X.@&5dGG?Бv<avqdLmm+r"i9mAEIm.QCN~ d@JA	g=J_T%"*B vKqr3uOHQaӘ@f63ZdP4k8?ϚfPʡts8yKsh;qPe	=SUc2PA|&CAƄ>oeF>@4D+Onzh}@iRSE
!HBsiAEê):7唰1	raQ >i>6R
VvE[@LċAYjDJQZ4d-Ϊ&nl%5WQ,Z+ښvi%/ҋ"unIHԙ
m,F`UU*("T,^?ێpp/iMՉ~s]Z	69eYm9c۾5-Ȗ~z
diArU'><7&{2V;v+ɂW ,Ez^
X%wxZjjkGc$kՖ#Le*خ*<-GdiK!4wȞtC,b0Ywe6"heLJjy15c>WXf=,Dn70r$BE+d@&3}K6Fc|2_ˉW03û1:Oq	zř3lϺpf!hBj9F3)=
'ІSNG2o)h9f<DZըƫZ%Zbp{B&Hk]y94dR3h=mCh9ķn7b.G
m$Y5A,QϛC]e}wmk.HPn/|5Ǹ7>,; @1YIWލt8aA݁HڸyFRPB/-zC'ѣgTp(<bnmݐA ]ٓ}x#焘N@4BmϽ|bpC5xS>Ώx>:hI )4ou w{La3껆e, n!nn.	a!~!l!$ !3^:	AO3.І-LN"%(~,	-¤fRA	GJ!,	KƐHNSF0Pp/M#0?j
p"3lhppu}ϐ!Œ
!4N)\"0(P$8|
ƀZiWQON)sqDa]4S1_vʶPbBX줰*!J$p
Wn3F"mҁ@p1#ެln%e
3)HD"(C4gVե=!($">lqeZqn!"-Ơ_Fw)G~M׮jߪ(l"""q"E"sC0Hq#=rrDJ$ﱬPTrm.
r4
dPS
1
"){wRLsk2
r~R!EaK+'
ege*+!~1ANrOȒVR2
--M.)
^c#XdzR3:p*5Y"xQ)11	A2-C`C"2Q72;23ő33',kJ4/5Kp
N/bݴ-/U;
#xh~Q!	sKa9NfR\@:_r; 3Ӆ3|M#O:0`=!56
T2y70v?) <(
@,eAA'r 4QZ7n.T33;7FBB@ 3a:D=LaE;4[If+2Gj46#G}<{H IMI3*]\I);+k%+F@
@R TS4ד\nM͠Mߴ08R D'&R󾉪@!P̶N	T2!5$H8Q;R"SEkS5S-SA!FUJPnUvUZV!tt3H(BXY@ZZ7E[I[q[[5 ATia6fހ]UEuN	쵟lu_!j`vYa]pZ+bbAC5hVO<6@
!& VeUOfkrk#6dzWU3	X	vێ֐IimbMc'k9ck6lǶlvmme1b52<MQ0Ndz/[d3Hp5v
:62q!q6Sv$O䦭|DŽɫ諾DGY.?MB@/877~Y![xkq့DX $47d9ltՖmnYtݴat
P
TX `il8pXtxx|8aϠ8
8AV0$&Wg_Xow`75,twxEx3OjԏEZ^$PǘwwoW{e{٢{Md/w//777
mBuyuy@}/T?ւ?7t9t?xnCxSx[_
bXho8w8x8xl4FG`2,p7wVa{~}RRs"EX(_)G.yQ+z莍z?{8Ywp|ۄw}}w~Q!5ya=akq!8'v=WEKWMAI؄@`e8@ŀYA
v	ewG3HYcw9Y2{D9Jte”M+"#pyMʟMzGzhSH{{b|#|'+/39<AZG:OzSWz[kes3ؖG׃equZxڧ9yۀ@2U7/K=P:˭rx&QZyَ"Kf#'79'5z9:AHMKYS[٥/8isyٗy{٨Zک{:
ko798)9GZ'x[hz;ٸ3ᛟںʰʄ!Mb
٢%-Y?G[)\sMU]ae7kZsw:SřyzƩoفr\FsV/cT0ȏU/ĭvr|hH9ǗOWL黰Z{ÏY?\919鼓'ܴ-|W9gA]5I|MQ\!}ŋ+=1yӗ;w/Sm:,`U=R)*}Ws,Zy,
Z傡<ٲ|\ܣ#K}sɝg}}}%ݸ)-]:ӝ[=5?#v^מ*RJ>5"ޮ!e*I	w[{ٽ<Z%159;={7QU;YcYiYoٶA}{]8#}ޏ/=]>4]/	h^AjXś}giRJc7$(P;~)̳۱\՜3[<\Á`{>?ÅtIbʔ*<x%\:1D1Yƍ:2ȑJ4.ʕȸt(W̘j2B&\<yJ	hD=4ҥL:%ZԩTZ*z@!;wZڂ~}'גpzp]zm n,heׯ$ѪzPhܚ5͜;{:՚O)^<H pA_ՙdb=fyhēݹi/a3:A={ȻOlرeͶJwo_ŀbG<Ye]`]jlݖnv`UP\sdĔ!L`Pu#ux%VdwVZlZ^(*D+
N;_cZZnɥ ^k&mov va"蕊-fz>5cxx:hyC^MvXb2eQ%f~~
jT-H)ordй,jէYhU(z
Vb9_D4I-iWkHjqInjᖱNcZlˣyƢU~DF+
xo./:%ûvJq+N^U~j^t5VJFpN!bp<1^tҚelrqtRX+N_1Yis2Ls+rGtE0H[M%CC+wUE5R2xPq=Zޒ5	d@]:Nw((Xw~wXx#5#Ǩ2~YT.6bˌy\-Jrmzz_}߮	~2~F-Mn|8#,/NgQIuO}|z@n*\*%صeIa?yJ5b#,
{X"C-A0Òw(u8W@(SD,Jf+Gaxdܒ*`pw!Z6<LE:ePgnB1IްwghdG>
tGQAọ˾S:<]!D*0fy6
8*ke82@2PQL.Tݩ2kkXtO]2Ō,fLr갘0ѧLfbG1$2%,AZSE\h=y8Ns*t4l'+t񓣲&z>ǠӊY͜G%~"Ul>&`4E.tt$&.* D݈Qht&hU95o+'OE~zaKb#Ȕ
i**~YF8G2qnM%i?-C-~d`}\Px@i;KsJ"U*ZҨ
iUB<6\
[1Ӟv=u2qzأ#/dy"SͪJ*M;DF*o
j\Bgu'ɀBmn>+?|V(r+
q8Tm:V{̮vvP9ߥR]7SW|E}{%W-3&1kJSLľd=]|εY$K/nrK"ZdYq\wc	K15q-֯Le촎1ʸ{o52&
r\-*V2+7;9Ήum{Y<@D;a+G=d8JNi7KΙ g]X|ݰ{F(cFuQW0ZxZhYK/R'e=z]c/5]qPzڤE7ucq`(܊)3SFZF6V,MgꦠψɎqF8nb^t./X7F8P>ܗ5O)k/V}ng%7ţIP|,CipWVk}RS\Ͼr<sN7š"X_E=1qEMJW]ԯOI_/94_" r=[ZXw o=<!C,^Dz5uW\B<=sݗ0[	ILV9ݗ=#]/eG(~bǺ܏{?#G賟{ߋ__>Eophoi}qP!kF
8~itP"qX!(?'	oۧ#+p^ut},(3z4;~;7F;ȃF{s=HEXN(N7FȄMxe/zNHUhrZkVȅ]oDu/^He^doKhkkȆf׆q(]Li8wEGg)}G>jH#*
$(Hhȉ艟(HhȊ芯X;O8FC(m:M YREaFWGVh\g.g,HtD$5maX!V̀z'/@BhΘvJzۏj"fB#\ꥆ&}(C'G;j4,@.:Yp&fYej)2drfmoi<Щ\> #$i茚B(I,dhڌEUNcbfBB4|njZe	%@)Ppe4j;誮ZK>*2>o&EpNq!3A2
 k(+ZBRbr~+/+Kk4>!1h+bLӶ̦;,H™OA¬.B(*)2dW!BXv)>kNk^kn+,(0html/figures/type.ai.gif010064400016050000001000000242670717757045100160560ustar00gfergother00002640000003GIF89a1̣~~̙fffffffffVCC3333,1@#dihlp,tmx|pH
$crl:ШtJZجvzxL.znQ%{}I|x~̔Νʪу~»zryuwJqx	H|*4-a8EHϽ~Jcg<'yIɓ(S\ɲ˗0cʜI͛8sɳϟ@
JʎM"gӧPJJիXjR{"lّXv	Q-\x	{Ivλ]{.I{oL˘1wJfN@i
R^z‚װgM۸s랼Ұ)A}8MͼswKNsrGP\"z	˟O\ޅq߹5^
HFXhp>X!
_: &ȡr`^^,80J2H4x1d#d;
!`""y`~Nב :h▋!b]<7^zzY}
_|Y@IԞ4<Dhl5xD*餔V)bD舅v駠ӡeuϥ
]h"T
")2ed^B%8㏭jE*XM5[ZR,bx-@Mٺ{FZZ˩W+{ap
"I\ax1 G1(y(0,4?5<<^IDm)/PG-TWmXg\w`-dmN3*М	[uϭ:8J~#MR$9-u!QOxG޸PSnW.ow.擟٬Gд88)o?{}^G/tg\9܇/_O觿ϧT'<! ~{™'H	*.z}G(̝	Sl.a`p>!)"(P"U(*ZqP:Ÿdm]B1()#xF5]t#XE9L#8D=<# )CA)4$")BE2t$$'@IR$&7	@Mr$(G	?V򕰌,gIK̥.wJ0Ib%2f:;{4Ib{ %gSĩ2rě#Ag:Mbn򔊲h<'NQ)3~~fc4\R8dMbMӜf;]2ѐUT'(;bNSJڗHC ӣMDRte/%XVN--IAMP]]?NGYUP1mQSw-KT)8"XXͪVծz`
XD	IZֶp\J׺yR葏-E:Xv? bVEc[",4$Ʈկ"a
	>"`,@b;XSe#0;\vc+lVr_{*2m1]]VmBB\R׳s!;DW ڡͯ~ܰo=DWQN%x7
XN[6aSh3Ԥ.#fa#s*q[0g*qJ&0_%yU1([!Yi<mJzT
86h,1HNe˦c5H:љ/OaIc,t	ЈNIלLӒYs،eIգMi,=f3dۺ6r+k}S@tA,L!i#nv&7`zˬ5L2d/Cg&EIY)a4'mJ3jjn;aꆷ{jwHؒ(m"wCa48$zڊnHϯ9
9.&OyH%k7.S|8Ϲ[T<+v-pVd[Ko	9:9qS3NuNtX?^Ǚ.Kvh??Nxۍw]T};~Nx#OL3yqCOhmSQ'>=G/tV~/[O~^?R+XA>/>s_/~ٓ??S=?xx8Ww*hr"qS:T}bTw TU
Utt%A.1NQ(lFR;d"ppV". p>lSFHT73-UXCDud$\-_8(A|mhj*&nh3p8tȆe|fx`|؇~8Zq;@ZwЈ8Xx؉8Xx؊88xxP2@؋8Xxʘ̸،8Xxژܸ؍8Xx꘎%W({HXx6hZf^U]^Y栐Y\9[
9^
)Ր`W
]钳\ЅyY\\5Yڐ]` E)^GY[ƵY̥H9F)W9\`\X	`	=][0^`yŏؠpוZ)%YzْA%6YY\9ɔ5Y5]p	)!tiL@s	u[U [i$yxoɒ9Yy8@`40!qPY9ƙʹٜ9Yyؙڹٝ9ىiIq깞צHch* Opk(mRb)"ppS%fon9oo,ş-fafG*&!+
ppzn%Sʠ$n*z{E}b9V,vL4=^n5>;
=ksEJH(c;QLkOzk69fqYcNdB7=*kb'nf&v*Rbq;/a#S5]vVve&&[lڛm)51rp(:wam`fVo7.ۂiJ.&g	ui	3FmQ'mmzctAREtzl-Ufc11†<j
pJ=!éW&o"'nR"Zboڢf6+jnxJ+:#awZ֢"/u°ͦdtkSz+ʬ+ծuƱ+
*00t&&Z&j]VxJD9Ggi$Jv끨N:.MFfZ@eT1JgRMAi"%jpVpƢtBhwStRtS'tknشrgn&pJ(fyp+Z,2בm´
vq{rB@o \{j(2tf4ed6&1:Jo";qzFp-{g6'
i!%Z}$ݒ&GR싲+g%.1+{[f
1JCzb*7@|鹣TI|I"H$\‹tᣵ,.02<4\Ƥ=*=sw<>ñ:hlm+m[J۳~;tuVZ5B3D(snZP#b={hfsNd:cav]'vY	Sj\sl`u,ųň<]\
dM+oܸ#M)QʼnwZş<64ҫ<Lʮʰ;<3=ux˸˺˼˾B(|<xTLGȜ)<~Ҝ~\w~ڼ\7||<
X܀<͞]ymk˼Gݽ7x
z]>tH
SmC ҅$MJ#}-*H&Ҝ0MB2=Ӎ6MI5<I8ӌBMUA]ԇDH@JvN}P{TMS}ʜZ
>]qV3d?f}jM?l֥p-Fo= $vEu|_`x=R׆=8\،G'ٖ-Ә٠є=ڠئM;Lڬ
w1ڲx],D۸3C|۾MӤ]}ȝʽd
}ӥMWH-*-Y)@)}
Fݽ)-[ȁ|2-yBAQPjQQ0AQ؝D{J
jPF;
SngԻ+$ǂ/QKᴂނ1ޝ"+qQ8:.k/ځ6.Jǩ&PKWZD,=/>T'](N:f;ej7A11rPy_>'T^(CSmRLuu3^{՝
>^~ꪾ\pxH^~뺞뼾>~e>^.fW^gž>^~a'?_
? "$?&_(*,.r@<>"86OGߏlid	`P
SO	V/SU]XeI<O`F&IGYv\ř3iY9~^N^s	۵^EEca0?^y]vi
ɘ5ʅ=o	/kBc[م?Y^do]\E]Z/Oϕu^oٯqɓ_)
@KM_8DEJ깺"'-vJm$f<6`TUrhA_/8l垻Z,>O9I= 0N0<<20]Ήԭ}^ym0"e҆ƅ
2+9?צYekoslJr (V8BHRkwϗN(pV1|DmI`uԽp!ǎ۰`(r$I*!K9y+Q$.4MLgFg*t(ѢF"Ml`ӧG'-҄q׭^*+ٱfˢ=6-۵n}+7.ݹv⽫7/߽~+80#6!9+>*$Vʖ/cάy3Ξ?-z4ҦONz5֮_Îdȭ{7޾.|8Ə#O|9ΟC.}:֯cϮ};pX剛;ϣO~=Ï_ϯ?ѷ}"2ؠBX}[AXb>(!;N7hn&vG$r]/yx:љ8(AY@0dot,"J&$FHBybTV[3c&ӄ-:=$|XV%Zi'rzbx)v*{	hy9(Bi5wct)-Щ.(yt'	(6Yg*oG'JG)iݖZ"%rI*%LR	Zeے˫;R؝spۀ{I&tle\0tpB/\cl!hi;e\'6 7,rx\7go;0+3{OC]0-+
64_cMy}uZ|4zYe]\)Bb:]|
,z"Gd95+h'Afn9e;_gv 8:Bn_
V-ZC:In[jfeЏ9S+}ڮgKP?V?[XFS@nssG=K<OQܣJji:C&^W"wzxiyެ'AިEG`:QŏRh
&Vq]T:/zq7ğW@-0pT9~xA#rRdbH0_#H?ҌtVBa
`C xD
񋊔|%%J)2;c*hXqD,;B}|LTfy\Ye1KH[.~+ʼnE3n;tYְMmFL.9➖'NWm3h>_fb![T@˄2Œ&YiVsx{F:ұ#"
F:M'"Q^񠀴9IQANq	ݰNN|`C١kԑ49N=%w5%s3/vS^iuB@
' 9I	5s6F=ʫ^ɚ,e+ò08pd'ς6g#GuDe[	cM6ˣΒ65-qԭ
vo|zJ_$Kh]΁p)5{d:w˵k;Ͳf+C'Yn%_O6Rs$u/3GZ7%,rP#!--xY^Xb\oNcF/Qjҫ7o`{F}k@
|{klߴj8ǻp%?w8W1-;qP+&!9R>G䳞(S2%c]yirlG}`afau؛ýXQG)s{Y{fV9RPm;BkV%p/uB{$l\dT&짤j=O1w&U?g.АjKɗנf'm^J20<K
l7'uefXVǪ)t-n,6s8IosZ^79Zk"6!.َ)*qC}$f;5MMkG4^mNi[3rU_*3t+6wȩ}*Q,s%/FN3Xj6?dyN#eFO:ӛ.5;=RҧnX:5=nAj_ý<n;mz;zmi<>'xW{ž5c><;σ* _=[>=ko>={u3}A=C?ҟ>{ᗾ/(uO0'@?7F|ɟOc;
P-<a_FA% * 6 N^`FE J	ټ߀$_9H՗Y~=S qVa"z`.aa:.Zri_ 
|W[	U} "5a!ޡ^: v!""شps՟5PsŠɠ$a N
6 R J!& %r ,:*	V`	&b.b-4b~t.c b1"c2^/F/aXs2Rc5Z5`4b7c8 3B3ZĨ:c;;c<<c==c>>:j##r	dݙ@$A*$%B:$5CJdEDZUEjeFzd~uGdkH$aI$UJݴK6MYLNNOOPZPQY@"RQ2S
RBTTRUSbVˆVrWzUXRXYWZ&Z[[\\]ΉY^v^_eM.`fea"fb2&-fcBf<fdRfLfeb{efrfo]fgylfh|fif5™dWjf^
PlhffmVfnfdfo6ogb
pfq'`"grr2'^:setJ'\Rguub'Zjvewz'Xgxrx'VyRez'Tg{2{'R|e}'Pg~~'Nd
Kh"I*肎d:GBhnREZNdjCrh.䇂Adh>ފ&^hhލ]iݐ)鑲]*)fZBivJrgZwbiriyz闢gzi癢i|g}iihij
2h"jJ2j:bhJRjzbjjꦒhzꉂj訒jhꌲjjhj
j"i
k:il".%2k9fXJ+Hkbki붒z+ukRָ+JJk`kd+B"ݻkk;k)kkl
IVe*,2ljB,>lŊdblhLzkrȒ~bdʪαl(lllm
m"m*2m:BmJRm#~j-rmnnmmm^ۂ܂
Zm֌-.-9f
.$,%
DnLnnnb4.t.<nT.uy.sHo.6rhn%a
B}Xwp$떇	":orȮ>宝ٮ6n\/YFƛ)qZtwwEFmn/prGDY^ֻe	˵۳,GM/o/up0vQ*Z%R9Bq\Tk#*Gk&/+/0$p@/p
뮂QqO03/XL)aO#Wzpsoop:1fquD
-\?-/{."ZH0S>1|L-oذr{pl2	$g2ڦntrm",;ׇq\qj/-7H+	1-P,432T 3kss7{7s7o8s939kr::h:s<0/<=,sRl@tAA#tB+B3tC;Cwv]DE[tEcEktFsF{tGGtHHtIItJJtKKtLLtMMtNNtOt_=4RQ#uR+R3uS8C=X<DmPuU[UUkVsuW{WuXXuYYuZZu[[u\\Yg5[?@;ᣵ,.02<4\Ƥ=*=sw<>ñ:hlm+m[J۳~;tuVZ5B3D(snZP#b={hfsNd:cav]'vY	Sj\sl`u,ųň<]\
dM+oܸ#M)QʼnwZş<64ҫ<Lʮʰ;<3=ux˸˺˼˾B(|<xTLGȜ)<~Ҝ~\w~ڼ\7||<
X܀<