Skip to content

Commit

Permalink
[IM] Improve router configuration update tool
Browse files Browse the repository at this point in the history
- add locking to allow only one script run per router handle
- reduce amount of variables required to be set by configuration
- keep trying to tell IXP Manager script is complete in the event of network issues / comms issues on mgmt networks
  • Loading branch information
barryo committed May 23, 2024
1 parent 9cc8ca2 commit 5ca4007
Showing 1 changed file with 116 additions and 20 deletions.
136 changes: 116 additions & 20 deletions tools/runtime/route-servers/api-reconfigure-example-birdv2.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#! /bin/bash
#
# Copyright (C) 2009 - 2022 Internet Neutral Exchange Association Company Limited By Guarantee.
# Copyright (C) 2009 - 2024 Internet Neutral Exchange Association Company Limited By Guarantee.
# All Rights Reserved.
#
# This file is part of IXP Manager.
Expand All @@ -20,16 +20,43 @@
# http://www.gnu.org/licenses/gpl-2.0.html
#

KEY="your-api-key"
URL_LOCK="https://ixp.example.com/api/v4/router/get-update-lock"
URL="https://ixp.example.com/api/v4/router/gen-config"
URL_DONE="https://ixp.example.com/api/v4/router/updated"
###########################################################################################
###########################################################################################
###
### CONFIGURE ME HERE
###
### This is where YOU need to set your specific IXP Manager installation details.
### Typically you only need to edit the first three.
###
###########################################################################################
###########################################################################################

APIKEY="your-api-key"
URLROOT="https://ixp.example.com"
BIRDBIN="/usr/sbin/bird"


# --- the following should be fine on a typical Debian / Ubuntu system:

URL_LOCK="${URLROOT}/api/v4/router/get-update-lock"
URL_CONF="${URLROOT}/api/v4/router/gen-config"
URL_DONE="${URLROOT}/api/v4/router/updated"

ETCPATH="/usr/local/etc/bird"
RUNPATH="/var/run/bird"
LOGPATH="/var/log/bird"
BIN="/usr/sbin/bird"
LOCKPATH="/tmp/ixp-manager-locks"



###########################################################################################
###########################################################################################
###
### Parse command line arguments, handle and set some necessary variables
###
###########################################################################################
###########################################################################################

# Parse arguments
export DEBUG=0
export FORCE_RELOAD=0
Expand Down Expand Up @@ -62,12 +89,53 @@ fi
mkdir -p $ETCPATH
mkdir -p $LOGPATH
mkdir -p $RUNPATH
mkdir -p $LOCKPATH


cfile="${ETCPATH}/bird-${handle}.conf"
dest="${cfile}.$$"
socket="${RUNPATH}/bird-${handle}.ctl"

cmd="curl --fail -s -X POST -H \"X-IXP-Manager-API-Key: ${KEY}\" ${URL_LOCK}/${handle} >/dev/null"

###########################################################################################
###########################################################################################
###
### Script locking - only allow one instance of this script per handle
###
###########################################################################################
###########################################################################################

LOCK="${LOCKPATH}/${handle}.lock"

remove_lock() {
rm -f "$LOCK"
}

another_locked_instance() {
echo "There is another instance running for ${handle} and locked via ${LOCK}, exiting"
exit 1
}

if [ -f "${LOCK}" ]; then
another_locked_instance
else
echo $$ > "${LOCK}"
trap remove_lock EXIT
fi





###########################################################################################
###########################################################################################
###
### Get a lock from IXP Manager to update the router
###
###########################################################################################
###########################################################################################

cmd="curl --fail -s -X POST -H \"X-IXP-Manager-API-Key: ${APIKEY}\" ${URL_LOCK}/${handle} >/dev/null"

if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd
Expand All @@ -77,7 +145,16 @@ if [[ $? -ne 0 ]]; then
exit 200
fi

cmd="curl --fail -s -H \"X-IXP-Manager-API-Key: ${KEY}\" ${URL}/${handle} >${dest}"

###########################################################################################
###########################################################################################
###
### Get the configuration from IXP Manager
###
###########################################################################################
###########################################################################################

cmd="curl --fail -s -H \"X-IXP-Manager-API-Key: ${APIKEY}\" ${URL_CONF}/${handle} >${dest}"

if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd
Expand All @@ -100,14 +177,24 @@ if [[ $( cat $dest | grep "protocol bgp pb_" | wc -l ) -lt 2 ]]; then
fi

# parse and check the config
cmd="${BIN} -p -c $dest"
cmd="${BIRDBIN} -p -c $dest"
if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd &>/dev/null
if [[ $? -ne 0 ]]; then
echo "ERROR: non-zero return from ${BIN} when parsing $dest"
echo "ERROR: non-zero return from ${BIRDBIN} when parsing $dest"
exit 7
fi



###########################################################################################
###########################################################################################
###
### Apply the configuration and start Bird if necessary
###
###########################################################################################
###########################################################################################

# config file should be okay; If everything is up and running, do we need a reload?

RELOAD_REQUIRED=1
Expand Down Expand Up @@ -137,22 +224,22 @@ fi
mv $dest $cfile

# are we running or do we need to be started?
cmd="${BIN}c -s $socket show memory"
cmd="${BIRDBIN}c -s $socket show memory"
if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd &>/dev/null

if [[ $? -ne 0 ]]; then
cmd="${BIN} -c ${cfile} -s $socket"
cmd="${BIRDBIN} -c ${cfile} -s $socket"

if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd &>/dev/null

if [[ $? -ne 0 ]]; then
echo "ERROR: ${BIN} was not running for $dest and could not be started"
echo "ERROR: ${BIRDBIN} was not running for $dest and could not be started"
exit 5
fi
elif [[ RELOAD_REQUIRED -eq 1 ]]; then
cmd="${BIN}c -s $socket configure"
cmd="${BIRDBIN}c -s $socket configure"
if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd &>/dev/null

Expand All @@ -163,7 +250,7 @@ elif [[ RELOAD_REQUIRED -eq 1 ]]; then
echo "Trying to revert to previous"
mv ${cfile}.conf $dest
mv ${cfile}.old ${cfile}
cmd="${BIN}c -s $socket configure"
cmd="${BIRDBIN}c -s $socket configure"
if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd &>/dev/null
if [[ $? -eq 0 ]]; then
Expand All @@ -180,13 +267,22 @@ else
fi
fi


###########################################################################################
###########################################################################################
###
### Tell IXP Manager that the config is complete and release the lock
###
###########################################################################################
###########################################################################################

# tell IXP Manager the router has been updated:
cmd="curl -s -X POST -H \"X-IXP-Manager-API-Key: ${KEY}\" ${URL_DONE}/${handle} >/dev/null"
cmd="curl -s -X POST -H \"X-IXP-Manager-API-Key: ${APIKEY}\" ${URL_DONE}/${handle} >/dev/null"
if [[ $DEBUG -eq 1 ]]; then echo $cmd; fi
eval $cmd

if [[ $? -ne 0 ]]; then
echo "Warning - could not inform IXP Manager via updated API"
fi
until eval $cmd; do
echo "Warning - could not inform IXP Manager via updated API - sleeping 60 secs and trying again"
sleep 60
done

exit 0

0 comments on commit 5ca4007

Please sign in to comment.