diff --git a/src/uraft/saunafs-uraft-helper.in b/src/uraft/saunafs-uraft-helper.in index ff0b6ce9b..eb749ac80 100644 --- a/src/uraft/saunafs-uraft-helper.in +++ b/src/uraft/saunafs-uraft-helper.in @@ -14,68 +14,68 @@ metadata_location= # Argument 1: Configuration that is missing # Argument 2: Where to find it print_missing_config() { - log_err "$1 file is missing, it looks like a clean installation." - log_info "You can use example configuration and fill it with appropriate data:" - log_info "cp ${2} ${1}" - exit ${SAUNAFS_URAFT_ERROR} + log_err "$1 file is missing, it looks like a clean installation." + log_info "You can use example configuration and fill it with appropriate data:" + log_info "cp ${2} ${1}" + exit ${SAUNAFS_URAFT_ERROR} } load_config() { - log_info "Loading config" - if [ -f ${SAUNAFS_MASTER_CONFIG} ] ; then - . <(sed "s/\ *=\ */=/g" ${SAUNAFS_MASTER_CONFIG} | grep "ADMIN_PASSWORD") - . <(sed "s/\ *=\ */=/g" ${SAUNAFS_MASTER_CONFIG} | grep "DATA_PATH") - else - print_missing_config ${SAUNAFS_MASTER_CONFIG} "@MASTER_EXAMPLES_SUBDIR@/sfsmaster.cfg" - fi + log_info "Loading config" + if [ -f ${SAUNAFS_MASTER_CONFIG} ] ; then + . <(sed "s/\ *=\ */=/g" ${SAUNAFS_MASTER_CONFIG} | grep "ADMIN_PASSWORD") + . <(sed "s/\ *=\ */=/g" ${SAUNAFS_MASTER_CONFIG} | grep "DATA_PATH") + else + print_missing_config ${SAUNAFS_MASTER_CONFIG} "@MASTER_EXAMPLES_SUBDIR@/sfsmaster.cfg" + fi - if [ -f ${SAUNAFS_URAFT_CONFIG} ] ; then - . <(sed "s/\ *=\ */=/g" ${SAUNAFS_URAFT_CONFIG}) - else - print_missing_config ${SAUNAFS_URAFT_CONFIG} "@URAFT_EXAMPLES_SUBDIR@/sauanfs_uraft.cfg" - fi + if [ -f ${SAUNAFS_URAFT_CONFIG} ] ; then + . <(sed "s/\ *=\ */=/g" ${SAUNAFS_URAFT_CONFIG}) + else + print_missing_config ${SAUNAFS_URAFT_CONFIG} "@URAFT_EXAMPLES_SUBDIR@/sauanfs_uraft.cfg" + fi - matocl_host=${LOCAL_MASTER_ADDRESS:=0} - log_debug "LOCAL_MASTER_ADDRESS=${matocl_host}" - matocl_port=${LOCAL_MASTER_MATOCL_PORT:=9421} - log_debug "LOCAL_MASTER_MATOCL_PORT=${matocl_port}" + matocl_host=${LOCAL_MASTER_ADDRESS:=0} + log_debug "LOCAL_MASTER_ADDRESS=${matocl_host}" + matocl_port=${LOCAL_MASTER_MATOCL_PORT:=9421} + log_debug "LOCAL_MASTER_MATOCL_PORT=${matocl_port}" - ipaddr=$(getent hosts ${URAFT_FLOATING_IP} | awk '{print $1}') - log_debug "URAFT_FLOATING_IP=${ipaddr}" - netmask=${URAFT_FLOATING_NETMASK} - log_debug "URAFT_FLOATING_NETMASK=${netmask}" - iface=${URAFT_FLOATING_IFACE} - log_debug "URAFT_FLOATING_IFACE=${iface}" + ipaddr=$(getent hosts ${URAFT_FLOATING_IP} | awk '{print $1}') + log_debug "URAFT_FLOATING_IP=${ipaddr}" + netmask=${URAFT_FLOATING_NETMASK} + log_debug "URAFT_FLOATING_NETMASK=${netmask}" + iface=${URAFT_FLOATING_IFACE} + log_debug "URAFT_FLOATING_IFACE=${iface}" - ipaddr2=${URAFT_FLOATING_IP_SECONDARY:=} - log_debug "URAFT_FLOATING_IP_SECONDARY=${ipaddr2}" - netmask2=${URAFT_FLOATING_NETMASK_SECONDARY:=} - log_debug "URAFT_FLOATING_NETMASK_SECONDARY=${netmask2}" - iface2=${URAFT_FLOATING_IFACE_SECONDARY:=} - log_debug "URAFT_FLOATING_IFACE_SECONDARY=${iface2}" + ipaddr2=${URAFT_FLOATING_IP_SECONDARY:=} + log_debug "URAFT_FLOATING_IP_SECONDARY=${ipaddr2}" + netmask2=${URAFT_FLOATING_NETMASK_SECONDARY:=} + log_debug "URAFT_FLOATING_NETMASK_SECONDARY=${netmask2}" + iface2=${URAFT_FLOATING_IFACE_SECONDARY:=} + log_debug "URAFT_FLOATING_IFACE_SECONDARY=${iface2}" - SAUNAFS_DATA_DIR=${DATA_PATH:="@DATA_PATH@"} + SAUNAFS_DATA_DIR=${DATA_PATH:="@DATA_PATH@"} - if [[ $ipaddr == "" || $netmask == "" || $iface == "" ]] ; then - log_err "Configuration file ${SAUNAFS_URAFT_CONFIG} does not contain valid network information." - log_info "See example @URAFT_EXAMPLES_SUBDIR@/saunafs-uraft.cfg file for reference." - exit ${SAUNAFS_URAFT_ERROR} - fi + if [[ $ipaddr == "" || $netmask == "" || $iface == "" ]] ; then + log_err "Configuration file ${SAUNAFS_URAFT_CONFIG} does not contain valid network information." + log_info "See example @URAFT_EXAMPLES_SUBDIR@/saunafs-uraft.cfg file for reference." + exit ${SAUNAFS_URAFT_ERROR} + fi - if [[ ! ${ADMIN_PASSWORD} ]] ; then - log_err "SaunaFS admin password must be set in order to authenticate to master server." - log_info "See example @SFSMASTER_EXAMPLES_SUBDIR@/sfsmaster.cfg file for reference." - exit ${SAUNAFS_URAFT_ERROR} - fi - log_info "Config successfully loaded" + if [[ ! ${ADMIN_PASSWORD} ]] ; then + log_err "SaunaFS admin password must be set in order to authenticate to master server." + log_info "See example @SFSMASTER_EXAMPLES_SUBDIR@/sfsmaster.cfg file for reference." + exit ${SAUNAFS_URAFT_ERROR} + fi + log_info "Config successfully loaded" } log_info() { if [[ $SAUNAFS_LOG_LEVEL = "warning" || $SAUNAFS_LOG_LEVEL = "warn" || $SAUNAFS_LOG_LEVEL == "err" || $SAUNAFS_LOG_LEVEL == "error" ]]; then return fi - logger - --priority user.info \ + logger + --priority user.info \ --stderr \ --tag saunafs-uraft-helper \ -- "${@}" @@ -85,16 +85,16 @@ log_warn() { if [[ $SAUNAFS_LOG_LEVEL = "err" || $SAUNAFS_LOG_LEVEL = "error" ]]; then return fi - logger - --priority user.warning \ + logger + --priority user.warning \ --stderr \ --tag saunafs-uraft-helper \ -- "${@}" } log_err() { - logger - --priority user.err \ + logger + --priority user.err \ --stderr \ --tag saunafs-uraft-helper \ -- "${@}" @@ -105,173 +105,173 @@ log_debug() { if [[ $SAUNAFS_LOG_LEVEL != "trace" ]]; then return fi - logger - --priority user.debug \ + logger + --priority user.debug \ --stderr \ --tag saunafs-uraft-helper \ -- "${@}" } saunafs_master() { - sfsmaster -o ha-cluster-managed -c $SAUNAFS_MASTER_CONFIG "$@" + sfsmaster -o ha-cluster-managed -c $SAUNAFS_MASTER_CONFIG "$@" } saunafs_admin() { log_debug "Running saunafs-admin with command: saunafs-admin ${*}" - saunafs-admin "$@" + saunafs-admin "$@" } get_metadata_version_from_file() { log_info "Getting metadata version from ${SAUNAFS_DATA_DIR}/metadata.sfs file" - local version=$(@SBIN_PATH@/sfsmetarestore -g -d "${SAUNAFS_DATA_DIR}" | grep -v warn 2> /dev/null) - if [[ $? == 0 && ${version} =~ ^[0-9]+$ ]]; then + local version=$(@SBIN_PATH@/sfsmetarestore -g -d "${SAUNAFS_DATA_DIR}" | grep -v warn 2> /dev/null) + if [[ $? == 0 && ${version} =~ ^[0-9]+$ ]]; then log_info "Metadata version: ${version}" - echo -n "${version}" - else + echo -n "${version}" + else log_warn "Could not get metadata version, or metadata is 0" - echo -n 0 - fi + echo -n 0 + fi } saunafs_promote() { log_info "Promoting this node to master" - saunafs_metadata_version 2> /dev/null - if [[ ${metadata_location} == "disk" ]] ; then - log_info "Metadata is on disk instead of RAM" - saunafs_master stop - unlink "${METADATA_LOCK}" - saunafs_master -o initial-personality=master -o auto-recovery restart - if [[ $? != 0 ]]; then - log_err "Promotion to master failed" - exit ${SAUNAFS_URAFT_ERROR} - fi - else - echo -n "${ADMIN_PASSWORD}" | \ - saunafs_admin promote-shadow "${matocl_host}" ${matocl_port} - fi - saunafs_assign_ip + saunafs_metadata_version 2> /dev/null + if [[ ${metadata_location} == "disk" ]] ; then + log_info "Metadata is on disk instead of RAM" + saunafs_master stop + unlink "${METADATA_LOCK}" + saunafs_master -o initial-personality=master -o auto-recovery restart + if [[ $? != 0 ]]; then + log_err "Promotion to master failed" + exit ${SAUNAFS_URAFT_ERROR} + fi + else + echo -n "${ADMIN_PASSWORD}" | \ + saunafs_admin promote-shadow "${matocl_host}" ${matocl_port} + fi + saunafs_assign_ip log_info "Node successfully promoted to master" } saunafs_demote() { - # drop ip - saunafs_drop_ip - # restart shadow - saunafs_master -o initial-personality=shadow restart + # drop ip + saunafs_drop_ip + # restart shadow + saunafs_master -o initial-personality=shadow restart log_info "Node successfully demoted to shadow" } saunafs_quick_stop() { log_warn "Stopping node without saving metadata" load_config - echo -n "${ADMIN_PASSWORD}" | \ - saunafs_admin stop-master-without-saving-metadata "${matocl_host}" ${matocl_port} + echo -n "${ADMIN_PASSWORD}" | \ + saunafs_admin stop-master-without-saving-metadata "${matocl_host}" ${matocl_port} } saunafs_metadata_version() { - # metadata-version can take arguments or read config file - if [[ $# == 3 ]] ; then - matocl_host=${2} - matocl_port=${3} - else + # metadata-version can take arguments or read config file + if [[ $# == 3 ]] ; then + matocl_host=${2} + matocl_port=${3} + else log_info "Reading config file to get node host and client port" - load_config - fi + load_config + fi log_info "Reading metadata version from host: ${matocl_host}:${matocl_port}" - local admin_result=$(saunafs_admin metadataserver-status --porcelain "${matocl_host}" "$matocl_port") - if [[ $? != 0 ]] ; then - log_err "Failed to query SaunaFS master status from saunafs-admin" - return $SAUNAFS_URAFT_ERROR - fi - local personality=$(echo "$admin_result" | cut -f1) - local connection=$(echo "$admin_result" | cut -f2) - local metadata_version_in_ram=$(echo "$admin_result" | cut -f3) - case "${personality}/${connection}" in - master/running) - metadata_location="ram" + local admin_result=$(saunafs_admin metadataserver-status --porcelain "${matocl_host}" "$matocl_port") + if [[ $? != 0 ]] ; then + log_err "Failed to query SaunaFS master status from saunafs-admin" + return $SAUNAFS_URAFT_ERROR + fi + local personality=$(echo "$admin_result" | cut -f1) + local connection=$(echo "$admin_result" | cut -f2) + local metadata_version_in_ram=$(echo "$admin_result" | cut -f3) + case "${personality}/${connection}" in + master/running) + metadata_location="ram" log_info "Metadata version in RAM: ${metadata_version_in_ram}" - echo -n ${metadata_version_in_ram} - return ${SAUNAFS_URAFT_OK} - ;; - shadow/connected|shadow/disconnected) - if (( metadata_version_in_ram > 0 )) ; then - metadata_location="ram" + echo -n ${metadata_version_in_ram} + return ${SAUNAFS_URAFT_OK} + ;; + shadow/connected|shadow/disconnected) + if (( metadata_version_in_ram > 0 )) ; then + metadata_location="ram" log_info "Metadata version in RAM: ${metadata_version_in_ram}" - echo -n ${metadata_version_in_ram} - return ${SAUNAFS_URAFT_OK} - else - local metadata_version_on_disk=$(get_metadata_version_from_file) - # Failing to read version from file results in metadata version 0, - # which means that no metadata is available. - metadata_location="disk" + echo -n ${metadata_version_in_ram} + return ${SAUNAFS_URAFT_OK} + else + local metadata_version_on_disk=$(get_metadata_version_from_file) + # Failing to read version from file results in metadata version 0, + # which means that no metadata is available. + metadata_location="disk" log_info "Metadata version on disk: ${metadata_version_on_disk}" - echo -n ${metadata_version_on_disk} - return ${SAUNAFS_URAFT_OK} - fi - ;; - *) - log_warn "Unexpected output from saunafs-admin: ${admin_result}" - return ${SAUNAFS_URAFT_OK} - ;; - esac + echo -n ${metadata_version_on_disk} + return ${SAUNAFS_URAFT_OK} + fi + ;; + *) + log_warn "Unexpected output from saunafs-admin: ${admin_result}" + return ${SAUNAFS_URAFT_OK} + ;; + esac } saunafs_isalive() { - saunafs_master isalive - if [[ $? == 0 ]] ; then - echo -n alive - else - echo -n dead - fi + saunafs_master isalive + if [[ $? == 0 ]] ; then + echo -n alive + else + echo -n dead + fi } saunafs_assign_ip() { - load_config - sudo ip -f inet addr add $ipaddr/$netmask dev $iface - iface_base=$(echo $iface | cut -f1 -d':') # for alias handling - arping -q -U -c5 -w1 $ipaddr -I $iface_base + load_config + sudo ip -f inet addr add $ipaddr/$netmask dev $iface + iface_base=$(echo $iface | cut -f1 -d':') # for alias handling + arping -q -U -c5 -w1 $ipaddr -I $iface_base - if [[ "$ipaddr2" != "" ]]; then - sudo ip -f inet addr add $ipaddr2/$netmask2 dev $iface2 - iface_base2=$(echo $iface2 | cut -f1 -d':') # for alias handling - arping -q -U -c5 -w1 $ipaddr2 -I $iface_base2 - fi + if [[ "$ipaddr2" != "" ]]; then + sudo ip -f inet addr add $ipaddr2/$netmask2 dev $iface2 + iface_base2=$(echo $iface2 | cut -f1 -d':') # for alias handling + arping -q -U -c5 -w1 $ipaddr2 -I $iface_base2 + fi } saunafs_drop_ip() { - load_config - sudo ip -f inet addr delete $ipaddr/$netmask dev $iface - if [[ "$ipaddr2" != "" ]]; then - sudo ip -f inet addr delete $ipaddr2/$netmask2 dev $iface2 - fi + load_config + sudo ip -f inet addr delete $ipaddr/$netmask dev $iface + if [[ "$ipaddr2" != "" ]]; then + sudo ip -f inet addr delete $ipaddr2/$netmask2 dev $iface2 + fi } saunafs_dead() { - saunafs_drop_ip + saunafs_drop_ip } print_help() { - echo "SaunaFS uraft helper script" - echo "Available commands:" - echo "isalive" - echo "metadata-version" - echo "quick-stop" - echo "promote" - echo "demote" - echo "assign-ip" - echo "drop-ip" - echo "dead" + echo "SaunaFS uraft helper script" + echo "Available commands:" + echo "isalive" + echo "metadata-version" + echo "quick-stop" + echo "promote" + echo "demote" + echo "assign-ip" + echo "drop-ip" + echo "dead" } case "$1" in - isalive) saunafs_isalive;; - metadata-version) saunafs_metadata_version $@;; - quick-stop) saunafs_quick_stop;; - promote) saunafs_promote;; - demote) saunafs_demote;; - assign-ip) saunafs_assign_ip;; - drop-ip) saunafs_drop_ip;; - dead) saunafs_dead;; - *) print_help;; + isalive) saunafs_isalive;; + metadata-version) saunafs_metadata_version $@;; + quick-stop) saunafs_quick_stop;; + promote) saunafs_promote;; + demote) saunafs_demote;; + assign-ip) saunafs_assign_ip;; + drop-ip) saunafs_drop_ip;; + dead) saunafs_dead;; + *) print_help;; esac