Skip to content

Instantly share code, notes, and snippets.

@netravnen
Last active October 9, 2019 10:48
Show Gist options
  • Save netravnen/16667887f2dac11d74b7866c610b40fe to your computer and use it in GitHub Desktop.
Save netravnen/16667887f2dac11d74b7866c610b40fe to your computer and use it in GitHub Desktop.
#!/bin/bash
#
# FILENAME: /usr/local/sbin/roa-export
#
#
# PARAMS
#
WORK_DIR=/tmp
ROA_DIR=/var/local/roa
ROA_OUTFILE_CSV=${ROA_DIR}/routinator.csv.out
ROUTINATOR_DOCKER_HOST_ID=c9517bf2b616
ROUTINATOR_CMD_PROC=routinator
ROUTINATOR_CMD_ARGS='vrps --format csv'
ISO_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
FILENAME=/usr/local/sbin/roa-export
uname2=$(ls -l $1 | awk '{print $3}')
#
# PRE-CHECK
#
if [ ! -d ${ROA_DIR} ] ; then mkdir -p ${ROA_DIR} ; fi
if [ ! -d ${ROA_DIR}/.git ] ; then
git -C ${ROA_DIR}/ init
git -C ${ROA_DIR}/ config user.name "roagen"
git -C ${ROA_DIR}/ config user.email "script@localhost"
git -C ${ROA_DIR}/ commit --allow-empty -m "Initial commit"
if [ ! -f ${ROA_DIR}/README.md ] ; then
touch ${ROA_DIR}/README.md
echo '## ROA EXPORT' | tee ${ROA_DIR}/README.md
git -C ${ROA_DIR}/ add README.md
fi
git -C ${ROA_DIR}/ commit README.md -m "Add README.md"
fi
if [ ! -f /etc/cron.hourly/roa-export ] ; then
ln -s ${FILENAME} /etc/cron.hourly/roa-export
fi
if [ ! -x ${FILENAME} ] ; then
chmod u+x ${FILENAME}
fi
if [ "$uname2" == "$USER" ] ; then
chown root ${FILENAME}
fi
#
# DUMP CSV OUTPUT FROM ROUTINATOR
#
docker exec -it ${ROUTINATOR_DOCKER_HOST_ID} ${ROUTINATOR_CMD_PROC} ${ROUTINATOR_CMD_ARGS} | sort -Vu > ${ROA_OUTFILE_CSV}
#
# REFORMAT THE WHOLE THING TO BIRD16 AND BIRD2 COMPLIANT FORMAT
#
for PROTO in 6 4 ; do
if [ $PROTO == "6" ] ; then
OUTFILE_BIRD16=${ROA_DIR}/${ROUTINATOR_CMD_PROC}.bird16_v6.out
OUTFILE_BIRD2=${ROA_DIR}/${ROUTINATOR_CMD_PROC}.bird2_v6.out
GREP_REGEX='^AS[0-9]+,[0-9a-f\:]+\/(19|[2-9][0-9]|1[01][0-9]|[12[0-8]),(19|[2-9][0-9]|1[01][0-9]|[12[0-8])'
else
OUTFILE_BIRD16=${ROA_DIR}/${ROUTINATOR_CMD_PROC}.bird16_v4.out
OUTFILE_BIRD2=${ROA_DIR}/${ROUTINATOR_CMD_PROC}.bird2_v4.out
GREP_REGEX='^AS[0-9]+,[0-9\.]+\/([8-9]|[12][0-9]|3[0-2]),([8-9]|[12][0-9]|3[0-2])'
fi
egrep "${GREP_REGEX}" ${ROA_OUTFILE_CSV} |
sed 's/^AS//' |
awk -F "," '{ printf "roa %s max %s as %s;\t# source %s\n",$2,$3,$1,toupper($4) }' | sort -Vu > ${OUTFILE_BIRD16}
egrep "${GREP_REGEX}" ${ROA_OUTFILE_CSV} |
sed 's/^AS//' |
awk -F "," '{ printf "route %s max %s as %s;\t# source %s\n",$2,$3,$1,toupper($4) }' | sort -Vu > ${OUTFILE_BIRD2}
if [ $PROTO == "6" ] ; then
COUNT_ROA_6=$(cat ${OUTFILE_BIRD16} | grep -v '^#' | grep -v '^$' | grep ^ro | wc -l)
else
COUNT_ROA_4=$(cat ${OUTFILE_BIRD16} | grep -v '^#' | grep -v '^$' | grep ^ro | wc -l)
fi
done
#
# COMMIT OUTPUT FILES TO LOCAL GIT REPOSITORY
#
# Commit latest version of ROA files
git -C ${ROA_DIR}/ add *.bird*_v*.out
git -C ${ROA_DIR}/ commit -m "Updated ROA files - $ISO_DATE" --quiet
# Push ROA repository to every remote configured
for REMOTE in $(git -C ${ROA_DIR}/ remote | egrep -v upstream | paste -sd " " -) ; do git -C ${ROA_DIR}/ push $REMOTE master:master --quiet ; done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment