ports/124238: [ports: heartbeat] patch request
Piotr Rybicki
meritus at innervision.pl
Tue Jun 3 15:30:02 UTC 2008
>Number: 124238
>Category: ports
>Synopsis: [ports: heartbeat] patch request
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-ports-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: update
>Submitter-Id: current-users
>Arrival-Date: Tue Jun 03 15:30:01 UTC 2008
>Closed-Date:
>Last-Modified:
>Originator: Piotr Rybicki
>Release: 7.0-R1
>Organization:
Innervision
>Environment:
I believe this is not needed
>Description:
#1
port sysutils/heartbeat has problem when trying to find an interface for ip address.
To fetch this interface, following line is applied (shell script):
$IFCONFIG | grep "$ipaddr" -B4 | grep "UP," | cut -d ":" -f 1
This usability is limited to one alias per interface (grep -B4).
I provide here a patch which drops this limitation.
#2
heartbeat lacks a proper 'resource' for starting/stopping rc.d scripts upon moving through the nodes. I provide here a script (BSDService) which allows this functionality. This file should be installed in /usr/local/etc/ha.d/resource.d
Please update this port by adding my 2 patches.
Best regards & have a good day!
>How-To-Repeat:
#1 - try using more than one IP alias as a cluster resource
#2 - try to use rc.d service as a cluster resource (in an easy way)
>Fix:
#1 - patch
# diff -u ~ryba/_ha_orig/IPaddr /usr/local/etc/ha.d/resource.d/IPaddr
--- /home/ryba/_ha_orig/IPaddr 2008-06-03 13:48:41.000000000 +0200
+++ /usr/local/etc/ha.d/resource.d/IPaddr 2008-06-03 14:24:26.000000000 +0200
@@ -80,6 +80,28 @@
}
#
+# Find out which alias serves the given IP address
+# The argument is an IP address, and its output
+# is an aliased interface name (e.g., "eth0:0").
+#
+find_interface_bsd() {
+
+ ipaddr="$1";
+
+ for ifname in `$IFCONFIG -l`
+ do
+# echo "IFNAME:$ifname"
+ $IFCONFIG $ifname | grep "inet.*[: ]$ipaddr " >/dev/null 2>&1
+ if [ $? -eq 0 ]
+ then
+ echo $ifname
+ return 0
+ fi
+ done
+ return 1
+}
+
+#
# Find out which alias serves the given IP address
# The argument is an IP address, and its output
# is an aliased interface name (e.g., "eth0:0").
@@ -131,6 +153,9 @@
SunOS)
IF=`find_interface_solaris $BASEIP`
;;
+ *BSD)
+ IF=`find_interface_bsd $BASEIP`
+ ;;
*)
IF=`find_interface_generic $BASEIP`
;;
@@ -461,6 +486,9 @@
SunOS)
j=1
;;
+ *BSD)
+ j=1
+ ;;
*)
j=0
TRYADRCNT=`ls "${NICBASE}:"* | wc -l | tr -d ' ' 2>/dev/null`
#2) - BSDService resource file:
# cat BSDService
#!/bin/sh
#
# Created VI 2008 by Piotr Rybicki (meritus at innervision.pl)
#
# This script can be used do start/stop FreeBSD's
# /usr/local/etc/rc.d/* services.
#
# One MUST NOT enable service (in /etc/rc.conf
# there cannot be SERVICE_enable"YES" line)
#
# usage: $0 {start|stop|status}
#
# An example usage in /usr/local/etc/ha.d/haresources:
# node1 10.0.0.170 BSDService::mysql-server
#
usage() {
cat <<-!
usage: $0 SERVICE {start|stop|status}";
!
exit 1
}
. /usr/local/etc/ha.d/shellfuncs
RCD=/usr/local/etc/rc.d
#VARLIB=/var/lib/heartbeat
#VLFILE=$VARLIB/rsctmp/Delay
BSDService_Status() {
if [ ! -f $RCD/$1 ]
then
echo "There is no $RCD/$1 script!. Fatal"
fi
$RCD/$1 onestatus 2>&1 1>/dev/null
if [ $? -eq 0 ]
then
if [ $2 = 'verbose' ]
then
echo "Service $1 is running OK"
fi
return 0
else
if [ $2 = 'verbose' ]
then
echo "Service $1 is NOT running"
fi
return 1
fi
}
BSDService_Start() {
BSDService_Status $1 noverbose
if [ $? -eq 0 ]
then
echo "Service $1 already running"
return 0
else
$RCD/$1 onestart
return $?
fi
}
BSDService_Stop() {
BSDService_Status $1 noverbose
if [ $? -eq 0 ]
then
$RCD/$1 onestop
return $?
else
echo "Service $1 already stopped"
return 0
fi
}
if [ $# -ne 2 ]
then
usage; exit 1;
fi
case $2 in
start) BSDService_Start $1 ;;
stop) BSDService_Stop $1 ;;
status) BSDService_Status $1 verbose ;;
*) usage
exit 1;;
esac
exit $?
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list