#!/bin/sh # CTDB event script for TGTD based iSCSI [ -n "$CTDB_BASE" ] || \ CTDB_BASE=$(d=$(dirname "$0") && cd -P "$d" && dirname "$PWD") . "${CTDB_BASE}/functions" # service_name is used by various functions # shellcheck disable=SC2034 service_name="iscsi" load_script_options [ -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 # x is intentionally ignored # shellcheck disable=SC2034 while IFS='|' read x ip pnn x ; do case "$ip" in *:*) have_ipv6=true ;; *) have_ipv4=true ;; esac done </dev/null 2>/dev/null pnn=$(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 $? ;; esac exit 0