mkdir -p $RPM_BUILD_ROOT{%{_libdir},%{_includedir}}
mkdir -p $RPM_BUILD_ROOT%{_prefix}/{bin,sbin}
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/ctdb
+mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/ctdb/events.d
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rc.d/init.d
install -m644 setup/ctdb.sysconfig $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/ctdb
install -m755 setup/ctdb.init $RPM_BUILD_ROOT%{initdir}/ctdb
install -m755 tools/events $RPM_BUILD_ROOT%{_sysconfdir}/ctdb/events
+install -m755 tools/events.d/samba $RPM_BUILD_ROOT%{_sysconfdir}/ctdb/events.d/samba
+install -m755 tools/events.d/nfslock $RPM_BUILD_ROOT%{_sysconfdir}/ctdb/events.d/nfslock
install -m755 tools/statd-callout $RPM_BUILD_ROOT%{_sysconfdir}/ctdb/statd-callout
install -m755 tools/onnode.ssh $RPM_BUILD_ROOT%{_bindir}
install -m755 tools/onnode.rsh $RPM_BUILD_ROOT%{_bindir}
%attr(755,root,root) %config %{initdir}/ctdb
%{_sysconfdir}/ctdb/events
+%{_sysconfdir}/ctdb/functions
+%{_sysconfdir}/ctdb/events.d/samba
+%{_sysconfdir}/ctdb/events.d/nfslock
%{_sysconfdir}/ctdb/statd-callout
%{_sbindir}/ctdbd
%{_bindir}/ctdb
--- /dev/null
+#!/bin/sh
+# event script for 'make test'
+
+cmd="$1"
+shift
+
+case $cmd in
+ startup)
+ echo "`date` ctdb startup event"
+ exit 0;
+ ;;
+
+ takeip)
+ echo "`date` ctdb takeip event for $1 $2 $3"
+ exit 0
+ ;;
+
+ releaseip)
+ echo "`date` ctdb releaseip event for $1 $2 $3"
+ exit 0
+ ;;
+
+ recovered)
+ echo "`date` ctdb recovered event"
+ exit 0
+ ;;
+
+ shutdown)
+ echo "`date` ctdb shutdown event"
+ exit 0
+ ;;
+esac
+
+echo "`/bin/date` Invalid command $cmd"
+exit 1
#!/bin/sh
-# sample event script for ctdb
+############################
+# main event script for ctdb
. /etc/sysconfig/ctdb
+. /etc/ctdb/functions
cmd="$1"
shift
case $cmd in
+ #############################
+ # called when ctdbd starts up
startup)
/bin/rm -rf /etc/ctdb/state
/bin/mkdir -p /etc/ctdb/state
- # wait for local services to come up.
- [ -z "$CTDB_WAIT_TCP_PORTS" ] || {
- all_ok=0
- echo "`/bin/date` Waiting for local tcp ports $CTDB_WAIT_TCP_PORTS"
- while [ $all_ok -eq 0 ]; do
- all_ok=1
- for p in $CTDB_WAIT_TCP_PORTS; do
- /usr/bin/nc -z 127.0.0.1 $p || all_ok=0
- done
- [ $all_ok -eq 1 ] || sleep 1
- /usr/bin/ctdb status > /dev/null 2>&1 || {
- echo "ctdb daemon has died. Exiting event startup"
- exit 1
- }
- done
- echo "`/bin/date` Local tcp services are up"
- }
- # wait for local directories to becomes available (could be slow to mount)
- [ -z "$CTDB_WAIT_DIRECTORIES" ] || {
- all_ok=0
- echo "`/bin/date` Waiting for local directories $CTDB_WAIT_DIRECTORIES"
- while [ $all_ok -eq 0 ]; do
- all_ok=1
- for d in $CTDB_WAIT_DIRECTORIES; do
- [ -d $d ] || all_ok=0
- done
- [ $all_ok -eq 1 ] || sleep 1
- /usr/bin/ctdb status > /dev/null 2>&1 || {
- echo "ctdb daemon has died. Exiting event startup"
- exit 1
- }
- done
- echo "`/bin/date` Local directories are available"
- }
- exit 0;
;;
-
+
+
+ ################################################
+ # called when ctdbd wants to claim an IP address
takeip)
if [ $# != 3 ]; then
echo "must supply interface, IP and maskbits"
echo "`/bin/date` Failed to add $ip/$maskbits on dev $iface"
exit 1
}
- echo $ip >> /etc/ctdb/state/taken_ips
- echo $ip >> /etc/ctdb/state/changed_ips
# flush our route cache
echo 1 > /proc/sys/net/ipv4/route/flush
-
- # having a list of what IPs we have allows statd to do the right
- # thing via /etc/ctdb/statd-callout
- /bin/touch /etc/ctdb/state/ip.$ip
- exit 0
;;
+
+ ##################################################
+ # called when ctdbd wants to release an IP address
releaseip)
if [ $# != 3 ]; then
echo "`/bin/date` must supply interface, IP and maskbits"
# flush our route cache
echo 1 > /proc/sys/net/ipv4/route/flush
-
- echo $ip >> /etc/ctdb/state/released_ips
- echo $ip >> /etc/ctdb/state/changed_ips
- /bin/rm -f /etc/ctdb/state/ip.$ip
- exit 0
;;
+
+ ###########################################
+ # called when ctdbd has finished a recovery
recovered)
- # if we have taken or released any ips we must send out
- # statd notifications to recover lost nfs locks
- [ -x /etc/ctdb/statd-callout ] && [ -f /etc/ctdb/state/changed_ips ] && {
- /etc/ctdb/statd-callout notify &
- } >/dev/null 2>&1
-
- # restart NFS to ensure that all TCP connections to the released ip
- # are closed
- [ -f /etc/ctdb/state/released_ips ] && {
- ( /sbin/service nfs status > /dev/null 2>&1 &&
- /sbin/service nfs restart > /dev/null 2>&1 ) &
- } > /dev/null 2>&1
- /bin/rm -f /etc/ctdb/state/changed_ips
- /bin/rm -f /etc/ctdb/state/released_ips
- /bin/rm -f /etc/ctdb/state/taken_ips
- exit 0
;;
+ ####################################
+ # called when ctdbd is shutting down
shutdown)
- # shutdown any services as necessary
- exit 0
;;
+
+ *)
+ echo "`/bin/date` Invalid ctdb event command $cmd"
+ exit 1
+ ;;
esac
-echo "`/bin/date` Invalid command $cmd"
-exit 1
+#######################################
+# call all application specific scripts
+[ -d /etc/ctdb/events.d ] && {
+ /bin/ls /etc/ctdb/events.d | /bin/grep -v '~' |
+ while read SCRIPT; do
+ [ -x /etc/ctdb/events.d/$SCRIPT ] && {
+ /etc/ctdb/events.d/$SCRIPT $cmd "$1" "$2" "$3" || exit 1
+ }
+ done
+}
+
+# all OK
+exit 0
--- /dev/null
+#!/bin/sh
+# event strict to manage lockd and statd in a cluster environment
+
+. /etc/sysconfig/ctdb
+
+cmd="$1"
+shift
+
+case $cmd in
+ startup)
+ /bin/mkdir -p /etc/ctdb/state/statd/ip
+ ;;
+
+ shutdown)
+ ;;
+
+ takeip)
+ ip=$2
+
+ echo $ip >> /etc/ctdb/state/statd/restart
+
+ # having a list of what IPs we have allows statd to do the right
+ # thing via /etc/ctdb/statd-callout
+ /bin/touch /etc/ctdb/state/statd/ip/$ip
+ ;;
+
+ releaseip)
+ ip=$2
+
+ echo $ip >> /etc/ctdb/state/statd/restart
+ /bin/rm -f /etc/ctdb/state/statd/ip/$ip
+ ;;
+
+ recovered)
+ # if we have taken or released any ips we must send out
+ # statd notifications to recover lost nfs locks
+ [ -x /etc/ctdb/statd-callout ] && [ -f /etc/ctdb/state/statd/restart ] && {
+ /etc/ctdb/statd-callout notify &
+ } >/dev/null 2>&1
+
+ /bin/rm -f /etc/ctdb/state/statd/restart
+ ;;
+esac
+
+exit 0
--- /dev/null
+#!/bin/sh
+# ctdb event script for Samba
+
+PATH=/bin:/usr/bin:$PATH
+
+. /etc/sysconfig/ctdb
+
+cmd="$1"
+shift
+
+case $cmd in
+ startup)
+ # wait for the Samba tcp ports to become available
+ smb_ports=`testparm -stv 2> /dev/null | egrep '\s*smb ports =' | cut -d= -f2"`
+ ctdb_wait_tcp_ports "Samba" $smb_ports
+
+ # wait for all shared directories to become available
+ smb_dirs=`testparm -st 2> /dev/null | egrep '^\s*path = ' | cut -d= -f2`
+ ctdb_wait_directories "Samba" $smb_dirs
+ ;;
+
+ takeip)
+ # nothing special for Samba
+ ;;
+
+ releaseip)
+ # nothing special for Samba
+ ;;
+
+ recovered)
+ # nothing special for Samba
+ exit 0
+ ;;
+
+ shutdown)
+ /etc/init.d/smb stop
+ /etc/init.d/winbind stop
+ ;;
+esac
+
+# ignore unknown commands
+exit 0
--- /dev/null
+# utility functions for ctdb event scripts
+
+
+######################################################
+# wait for a set of tcp ports
+# usage: ctdb_wait_tcp_ports SERICE_NAME <ports...>
+######################################################
+ctdb_wait_tcp_ports() {
+ service_name="$1"
+ shift
+ wait_ports="$*"
+ [ -z "$wait_ports" ] && return;
+ all_ok=0
+ echo "`/bin/date` Waiting for tcp service $service_name to start"
+ while [ $all_ok -eq 0 ]; do
+ all_ok=1
+ for p in $wait_ports; do
+ /usr/bin/nc -z 127.0.0.1 $p || all_ok=0
+ done
+ [ $all_ok -eq 1 ] || sleep 1
+ /usr/bin/ctdb status > /dev/null 2>&1 || {
+ echo "ctdb daemon has died. Exiting tcp wait $service_name"
+ exit 1
+ }
+ done
+ echo "`/bin/date` Local tcp services for $service_name are up"
+}
+
+
+######################################################
+# wait for a set of directories
+# usage: ctdb_wait_directories SERICE_NAME <directories...>
+######################################################
+ctdb_wait_directories() {
+ service_name="$1"
+ shift
+ wait_dirs="$*"
+ [ -z "$wait_dirs" ] && return;
+ all_ok=0
+ echo "`/bin/date` Waiting for local directories for $service_name"
+ while [ $all_ok -eq 0 ]; do
+ all_ok=1
+ for d in $wait_dirs; do
+ [ -d $d ] || all_ok=0
+ done
+ [ $all_ok -eq 1 ] || sleep 1
+ /usr/bin/ctdb status > /dev/null 2>&1 || {
+ echo "ctdb daemon has died. Exiting directory wait for $service_name"
+ exit 1
+ }
+ done
+ echo "`/bin/date` Local directories for $service_name are available"
+}
+
#!/bin/sh
+# this script needs to be installed so that statd points to it with the -H
+# command line argument. The easiest way to do that is
+
. /etc/sysconfig/ctdb
[ -z "$STATD_SHARED_DIRECTORY" ] && exit 0
case "$1" in
add-client)
- for f in `/bin/ls /etc/ctdb/state/ip.*`; do
- fname=`/bin/basename $f`
- ip=`echo $fname | cut -d. -f2-`
+ for f in `/bin/ls /etc/ctdb/state/statd/ip/*`; do
+ ip=`/bin/basename $f`
[ -d $STATD_SHARED_DIRECTORY/$ip ] || /bin/mkdir $STATD_SHARED_DIRECTORY/$ip
- /bin/touch $STATD_SHARED_DIRECTORY/$ip/$2
+ /bin/touch $STATD_SHARED_DIRECTORY/$ip/sm/$2
done
;;
del-client)
- for f in `/bin/ls /etc/ctdb/state/ip.*`; do
- fname=`/bin/basename $f`
- ip=`echo $fname | cut -d. -f2-`
- /bin/rm -f $STATD_SHARED_DIRECTORY/$ip/$2
+ for f in `/bin/ls /etc/ctdb/state/statd/ip/*`; do
+ ip=`/bin/basename $f`
+ /bin/rm -f $STATD_SHARED_DIRECTORY/$ip/sm/$2
done
;;
notify)
/sbin/service nfslock stop > /dev/null 2>&1
/sbin/service nfslock start > /dev/null 2>&1
# send out notifications to any additional ips we now serve
- for f in `/bin/ls /etc/ctdb/state/ip.*`; do
- fname=`/bin/basename $f`
- ip=`echo $fname | cut -d. -f2-`
+ for f in `/bin/ls /etc/ctdb/state/statd/ip/*`; do
+ ip=`/bin/basename $f`
[ -d $STATD_SHARED_DIRECTORY/$ip ] && {
# we must copy to a different directory since rpc.statd gets
# "upset" if sm-notify touches the files.
/bin/rm -rf /tmp/statd/$ip
/bin/mkdir -p /tmp/statd/$ip
/bin/cp -apr $STATD_SHARED_DIRECTORY/$ip/* /tmp/statd/$ip
- /usr/sbin/sm-notify -P /tmp/statd/$ip -v $ip -n
+ [ -x /usr/sbin/sm-notify ] && /usr/sbin/sm-notify -P /tmp/statd/$ip -v $ip -n
}
done
;;
esac
-