Skip to content

Instantly share code, notes, and snippets.

@thomasdarimont
Last active March 9, 2024 01:31
Show Gist options
  • Save thomasdarimont/283397dd3b76d2c73237cca0376b32bb to your computer and use it in GitHub Desktop.
Save thomasdarimont/283397dd3b76d2c73237cca0376b32bb to your computer and use it in GitHub Desktop.
Shell script to configure load- balancing with mod-proxy-balancer
#! /bin/sh
# Set up a default search path
PATH="/usr/bin:/bin"
CURL=`which curl`
if [ -z "$CURL" ]; then
echo "curl not found"
exit 1
fi
target="http://localhost/balancer-manager"
while getopts "t:" opt; do
case "$opt" in
t)
target=$OPTARG
;;
esac
done
shift $(($OPTIND - 1))
action=$1
list_balancers() {
$CURL -s "${target}" | grep "balancer://" | sed "s/.*balancer:\/\/\(.*\)<\/h3>.*/\1/"
}
list_workers() {
balancer=$1
if [ -z "$balancer" ]; then
echo "Usage: $0 [-s host] [-p port] [-m balancer-manager] list-workers balancer_name"
echo " balancer_name : balancer name"
exit 1
fi
$CURL -s "${target}" | grep "/balancer-manager?b=${balancer}&w" | sed "s/.*href='\(.[^']*\).*/\1/" | sed "s/.*w=\(.*\)&.*/\1/"
}
enable() {
balancer=$1
worker=$2
if [ -z "$balancer" ] || [ -z "$worker" ]; then
echo "Usage: $0 [-s host] [-p port] [-m balancer-manager] enable balancer_name worker_route"
echo " balancer_name : balancer/cluster name"
echo " worker_route : worker route e.g.) ajp://192.1.2.3:8009"
exit 1
fi
nonce=`$CURL -s "${target}" | grep nonce | grep "${balancer}" | sed "s/.*nonce=\(.*\)['\"].*/\1/" | tail -n 1`
if [ -z "$nonce" ]; then
echo "balancer_name ($balancer) not found"
exit 1
fi
echo "Enabling $2 of $1..."
# Apache 2.2.x
$CURL -s -o /dev/null "${target}?b=${balancer}&w=${worker}&nonce=${nonce}&dw=Enable&lf=1&ls=0&wr=&rr="
# newer Apache
#$CURL -s -o /dev/null -XPOST "${target}?" -d b="${balancer}" -d w="${worker}" -d nonce="${nonce}" -d w_status_D=0
sleep 2
status
}
disable() {
balancer=$1
worker=$2
if [ -z "$balancer" ] || [ -z "$worker" ]; then
echo "Usage: $0 [-s host] [-p port] [-m balancer-manager] disable balancer_name worker_route"
echo " balancer_name : balancer/cluster name"
echo " worker_route : worker route e.g.) ajp://192.1.2.3:8009"
exit 1
fi
echo "Disabling $2 of $1..."
nonce=`$CURL -s "${target}" | grep nonce | grep "${balancer}" | sed "s/.*nonce=\(.*\)['\"].*/\1/" | tail -n 1`
if [ -z "$nonce" ]; then
echo "balancer_name ($balancer) not found"
exit 1
fi
# Apache 2.2.x
$CURL -s -o /dev/null "${target}?b=${balancer}&w=${worker}&nonce=${nonce}&dw=Disable&lf=1&ls=0&wr=&rr="
# Newer Apache ...
#$CURL -s -o /dev/null -XPOST "${target}" -d b="${balancer}" -d w="${worker}" -d nonce="${nonce}" -d w_status_D=1
sleep 2
status
}
status() {
$CURL -s "${target}" | grep "href" | sed "s/<[^>]*>/ /g"
}
case "$1" in
list-balancer)
list_balancers "${@:2}"
;;
list-worker)
list_workers "${@:2}"
;;
enable)
enable "${@:2}"
;;
disable)
disable "${@:2}"
;;
status)
status "${@:2}"
;;
*)
echo "Usage: $0 {list-balancer|list-worker|enable|disable|status}"
echo ""
echo "Options: "
echo " -t target (e.g. https://app.acme.com/balancer-manager)"
echo ""
echo "Commands: "
echo " list-balancer"
echo " list-worker balancer-name"
echo " enable balancer_name worker_route"
echo " disable balancer_name worker_route"
exit 1
esac
exit $?
@mevansgh1
Copy link

Where did you find the docs for the balancer parameters such as w_status_D ?

@gjwnc
Copy link

gjwnc commented Sep 17, 2019

In new versions you need to add the referer in the http request. I'm also using IFS to allow the host to be configurable in case one has many balancers for each vhost.

#!/bin/bash

# Set up a default search path
PATH="/usr/bin:/bin"

CURL=`which curl`
if [ -z "$CURL" ]; then
  echo "curl not found"
  exit 1
fi

target="http://127.0.0.1/balancer-manager"
host="127.0.0.1"
while getopts "t:h:" opt; do
  case "$opt" in
    t)
      target=$OPTARG
      ;;
    h)
      host=$OPTARG
      ;;
  esac
done

curlopts="--insecure§-H§Host: $host§-H§Referer: http://$host/balancer-manager"

shift $(($OPTIND - 1))
action=$1


list_balancers() {
  OFS=$IFS
  IFS="§"
  $CURL $curlopts -s "${target}" | grep "balancer://" | sed "s/.*balancer:\/\/\(.*\)<\/a>.*/\1/"
  IFS=$OFS
}

list_workers() {
  balancer=$1
  if [ -z "$balancer" ]; then
    echo "Usage: $0 [-s host] [-p port] [-m balancer-manager]  list-workers  balancer_name"
    echo "  balancer_name :    balancer name"
    exit 1
  fi

  OFS=$IFS
  IFS="§"
  OUT=$($CURL $curlopts -s "${target}")
  IFS=$OFS

  echo "${OUT}" | grep "/balancer-manager?b=${balancer}&amp;w" | sed "s/.*href='\(.[^']*\).*/\1/" | sed "s/.*w=\(.*\)&.*/\1/"
}

enable() {
  balancer=$1
  worker=$2
  if [ -z "$balancer" ] || [ -z "$worker" ]; then
    echo "Usage: $0 [-s host] [-p port] [-m balancer-manager]  enable  balancer_name  worker_route"
    echo "  balancer_name :    balancer/cluster name"
    echo "  worker_route  :    worker route e.g.) ajp://192.1.2.3:8009"
    exit 1
  fi

  OFS=$IFS
  IFS="§"

  nonce=`$CURL $curlopts -s "${target}" | grep nonce | grep "${balancer}" | sed "s/.*nonce=\(.*\)['\"].*/\1/" | tail -n 1`
  if [ -z "$nonce" ]; then
    echo "balancer_name ($balancer) not found"
    exit 1
  fi

  echo "Enabling $2 of $1..."
  # Apache 2.2.x
  #$CURL $curlopts -s -o /dev/null "${target}?b=${balancer}&w=${worker}&nonce=${nonce}&dw=Enable&lf=1&ls=0&wr=&rr="

  # newer Apache
  $CURL $curlopts -s -o /dev/null -XPOST "${target}?" -d b="${balancer}" -d w="${worker}" -d nonce="${nonce}" -d w_status_D=0

  IFS=$OFS

  sleep 0.5
  status
}

disable() {
  balancer=$1
  worker=$2
  if [ -z "$balancer" ] || [ -z "$worker" ]; then
    echo "Usage: $0 [-s host] [-p port] [-m balancer-manager]  disable  balancer_name  worker_route"
    echo "  balancer_name :    balancer/cluster name"
    echo "  worker_route  :    worker route e.g.) ajp://192.1.2.3:8009"
    exit 1
  fi

  OFS=$IFS
  IFS="§"

  echo "Disabling $2 of $1..."
  nonce=`$CURL $curlopts -s "${target}" | grep nonce | grep "${balancer}" | sed "s/.*nonce=\(.*\)['\"].*/\1/" | tail -n 1`
  if [ -z "$nonce" ]; then
    echo "balancer_name ($balancer) not found"
    exit 1
  fi

  # Apache 2.2.x
  #$CURL $curlopts -s -o /dev/null "${target}?b=${balancer}&w=${worker}&nonce=${nonce}&dw=Disable&lf=1&ls=0&wr=&rr="

  # Newer Apache ...
  $CURL $curlopts -s -o /dev/null -XPOST "${target}" -d b="${balancer}" -d w="${worker}" -d nonce="${nonce}" -d w_status_D=1

  IFS=$OFS

  sleep 0.5
  status
}

status() {
  OFS=$IFS
  IFS="§"

  $CURL $curlopts -s "${target}" | grep "href" | sed "s/<[^>]*>/ /g"

  IFS=$OFS
}

case "$1" in
  list-balancer)
    list_balancers "${@:2}"
        ;;
  list-worker)
    list_workers "${@:2}"
        ;;
  enable)
    enable "${@:2}"
        ;;
  disable)
    disable "${@:2}"
        ;;
  status)
    status "${@:2}"
        ;;
  *)
    echo "Usage: $0 {list-balancer|list-worker|enable|disable|status}"
        echo ""
        echo "Options: "
        echo "    -t target (e.g. https://app.acme.com/balancer-manager)"
        echo ""
        echo "Commands: "
        echo "    list-balancer"
        echo "    list-worker  balancer-name"
        echo "    enable   balancer_name  worker_route"
        echo "    disable  balancer_name  worker_route"
    exit 1
esac

exit $?

@oleksandriegorov
Copy link

Forked and added following changes:

  • "nonce" is now picked correctly even if balancers have names, consisting of one another : e.g. httpbalancer, euhttpbalancer
  • CURL is constructed based on HTTPD version. if HTTPD version cannot be determined - newer apache (2.4.X) implied.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment