#!/bin/sh # CTDB event script for TGTD based iSCSI [ -n "$CTDB_BASE" ] || \ export CTDB_BASE=$(cd -P $(dirname "$0") ; dirname "$PWD") . $CTDB_BASE/functions service_name="iscsi" loadconfig ctdb_start_stop_service is_ctdb_managed_service || exit 0 [ -z "$CTDB_START_ISCSI_SCRIPTS" ] && { echo "No iscsi start script directory found" exit 0 } case "$1" in ipreallocated) all_ips=$(ctdb -X ip | tail -n +2) # Block the iSCSI port. Only block for the address families # we have configured. This copes with, for example, ip6tables # being unavailable on an IPv4-only system. have_ipv4=false have_ipv6=false while IFS='|' read x ip pnn x ; do case "$ip" in *:*) have_ipv6=true ;; *) have_ipv4=true ;; esac done </dev/null 2>/dev/null ctdb_get_pnn [ -n "$pnn" ] || die "Failed to get node pnn" # Start iSCSI daemon tgtd >/dev/null 2>&1 # Run a script for each currently hosted public IP address ips=$(echo "$all_ips" | awk -F'|' -v pnn=$pnn '$3 == pnn {print $2}') for ip in $ips ; do script="${CTDB_START_ISCSI_SCRIPTS}/${ip}.sh" if [ -x "$script" ] ; then echo "Starting iSCSI service for public address ${ip}" "$script" fi done # Unblock iSCSI port. These can be unconditional (compared to # blocking above), since errors are redirected. while iptables -D INPUT -p tcp --dport 3260 -j DROP >/dev/null 2>&1 ; do : done while ip6tables -D INPUT -p tcp --dport 3260 -j DROP >/dev/null 2>&1 ; do : done ;; shutdown) # Shutdown iSCSI daemon when ctdb goes down killall -9 tgtd >/dev/null 2>&1 ;; monitor) ctdb_check_tcp_ports 3260 || exit $? ;; *) ctdb_standard_event_handler "$@" ;; esac exit 0