
petersen at strands
Jul 10, 2008, 10:47 AM
Post #1 of 6
(362 views)
Permalink
|
This is my first adventure into OCF scripts, so I'm quite certain I have no idea what I'm doing. However, the Route script recently posted was something that I've been looking for recently, and needed a few tweaks to meet my requirements. In the spirit of giving back, here are the changes I made - maybe they will be useful to someone. In summary, I wanted to be able to manipulate both traditional "routes" as well as "policy routes". Now that I made these changes, I'm thinking it might have been more appropriate to just create a new PolicyRoute script to make the distinction more clear. In any event, I also wrote a wrapper script for heartbeat so I can now bring up multiple routes and define a default gateway for each one, all from heartbeat. Which is really neat. Thanks! -poul --- Route.orig 2008-07-10 17:32:09.000000000 +0000 +++ Route 2008-07-10 17:34:59.000000000 +0000 @@ -63,7 +63,7 @@ <parameters> -<parameter name="destination" unique="1" required="1"> +<parameter name="destination" unique="1" > <longdesc lang="en"> The destination network (or host) to be configured for the route. Specify the netmask suffix in CIDR notation (e.g. "/24"). @@ -93,12 +93,37 @@ <parameter name="source" unique="1"> <longdesc lang="en"> -The source IP address to be configured for the route. +The source is the IP to prefer for routing outbound packets. </longdesc> <shortdesc lang="en">Source IP address</shortdesc> <content type="string" default="" /> </parameter> +<parameter name="from" unique="1"> +<longdesc lang="en"> +The "from" parameter is used by "ip rule" to define how to match +packets based on their origin. This field should be in CIDR format: IP/NETMASK +</longdesc> +<shortdesc lang="en">From IP/MASK</shortdesc> +<content type="string" default="" /> +</parameter> + +<parameter name="object" unique="1"> +<longdesc lang="en"> +The object type that is being manipulated: currently route or rule +</longdesc> +<shortdesc lang="en">Object Type</shortdesc> +<content type="string" default="" /> +</parameter> + +<parameter name="table" unique="1"> +<longdesc lang="en"> +The route table in which to perform the action. +</longdesc> +<shortdesc lang="en">Table Integer</shortdesc> +<content type="integer" default="" /> +</parameter> + </parameters> <actions> @@ -117,17 +142,40 @@ ####################################################################### create_route_spec() { - # Creates a route specification for use by "ip route (add|del|show)" - route_spec="to ${OCF_RESKEY_destination}" + # Creates a route specification for use by "ip ${OCF_RESKEY_object} (add|del|show)" + + if [ -n "${OCF_RESKEY_destination}" ]; then + route_spec="to ${OCF_RESKEY_destination}" + fi + + case ${OCF_RESKEY_object} in + rule) + + if [ -n "${OCF_RESKEY_from}" ]; then + route_spec="${route_spec} from ${OCF_RESKEY_from}" + fi + ;; + + route) + + if [ -n "${OCF_RESKEY_gateway}" ]; then + route_spec="${route_spec} via ${OCF_RESKEY_gateway}" + fi + + if [ -n "${OCF_RESKEY_source}" ]; then + route_spec="${route_spec} src ${OCF_RESKEY_source}" + fi + ;; + esac + if [ -n "${OCF_RESKEY_device}" ]; then route_spec="${route_spec} dev ${OCF_RESKEY_device}" fi - if [ -n "${OCF_RESKEY_gateway}" ]; then - route_spec="${route_spec} via ${OCF_RESKEY_gateway}" - fi - if [ -n "${OCF_RESKEY_source}" ]; then - route_spec="${route_spec} src ${OCF_RESKEY_source}" + + if [ -n "${OCF_RESKEY_table}" ]; then + route_spec="${route_spec} table ${OCF_RESKEY_table}" fi + echo "$route_spec" } @@ -147,7 +195,7 @@ return $OCF_SUCCESS fi route_spec="$(create_route_spec)" - if ip route add $route_spec; then + if ip ${OCF_RESKEY_object} add $route_spec; then ocf_log info "${OCF_RESOURCE_INSTANCE} Added network route: $route_spec" return $OCF_SUCCESS else @@ -162,7 +210,8 @@ case $status in $OCF_SUCCESS) route_spec="$(create_route_spec)" - if ip route del $route_spec; then +ocf_log "ip ${OCF_RESKEY_object} del $route_spec" + if ip ${OCF_RESKEY_object} del $route_spec; then ocf_log info "${OCF_RESOURCE_INSTANCE} Removed network route: $route_spec" return $OCF_SUCCESS else @@ -178,20 +227,34 @@ } route_status() { - show_output="$(ip route show $(create_route_spec) 2>/dev/null)" - if [ $? -eq 0 ]; then + + route_spec=$(create_route_spec) + + case ${OCF_RESKEY_object} in + rule) + route_spec=`echo "$route_spec" | sed -e 's/table/lookup/g' -e 's/\/32//g' -e 's/^\ *//'` + show_output="$(ip ${OCF_RESKEY_object} show | grep "$route_spec" 2>/dev/null)" + ;; + + route) + + show_output="$(ip ${OCF_RESKEY_object} show $route_spec 2>/dev/null)" + ;; + esac + + if [ $? -eq 0 ] || [ "${OCF_RESKEY_object}" = "rule" ]; then if [ -n "$show_output" ]; then - # "ip route show" returned zero, and produced output on + # "ip ${OCF_RESKEY_object} show" returned zero, and produced output on # stdout. That is what we expect. return $OCF_SUCCESS else - # "ip route show" returned zero, but produced no + # "ip ${OCF_RESKEY_object} show" returned zero, but produced no # output on stdout. Assume the route was cleanly # unconfigured. return $OCF_NOT_RUNNING fi else - # "ip route show" returned an error code. Assume something + # "ip ${OCF_RESKEY_object} show" returned an error code. Assume something # went wrong. return $OCF_ERR_GENERIC fi @@ -199,6 +262,11 @@ route_validate() { # If we're running as a clone, are the clone meta attrs OK? + + if [ "${OCF_RESKEY_object}" = "rule" ]; then + return $OCF_SUCCESS + fi + if [ "${OCF_RESKEY_CRM_meta_clone}" ]; then if [ "${OCF_RESKEY_CRM_meta_clone_node_max}" -ne 1 ]; then ocf_log error "Misconfigured clone parameters. Must set meta attribute \"clone_node_max\" to 1, got ${OCF_RESKEY_CRM_meta_clone_node_max}." @@ -235,7 +303,7 @@ fi # If a gateway address has been configured, is it reachable? if [ -n "${OCF_RESKEY_gateway}" ]; then - if ! ip route get ${OCF_RESKEY_gateway} >/dev/null 2>&1; then + if ! ip ${OCF_RESKEY_object} get ${OCF_RESKEY_gateway} >/dev/null 2>&1; then ocf_log error "Gateway address ${OCF_RESKEY_gateway} is unreachable." # same reason as with _device: return $OCF_ERR_INSTALLED _______________________________________________________ Linux-HA-Dev: Linux-HA-Dev[at]lists.linux-ha.org http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev Home Page: http://linux-ha.org/
|