From b5f218c4a6c141ce8208584b912fc6b052f1df8d Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sat, 28 Sep 2013 22:30:52 +0200 Subject: vserver.functions: add missing s --- vserver.functions | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 vserver.functions (limited to 'vserver.functions') diff --git a/vserver.functions b/vserver.functions new file mode 100644 index 0000000..8a56d8b --- /dev/null +++ b/vserver.functions @@ -0,0 +1,129 @@ +# source the real file +. ${__REAL_PKGLIBDIR}/vserver.functions +__PKGLIBDIR="${__REAL_PKGLIBDIR}" + +# +# own functions +# + +function netnsCreateMac() { + local mac + + getFileValue mac "${1}/mac" + if [ -n "$mac" ]; then + echo "$mac" + return 0 + fi + + getFileValue ctx "$VSERVER_DIR"/context + ( + printf "0200" + printf "%06d" $ctx + printf "%02x" "$(basename "$1")" + )| + sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/' +} + +function netnsCreateIfaceName() { + local name + + getFileValue name "${1}/name" + if [ -n "$name" ]; then + echo "$name" + return 0 + fi + + printf "%s%d" "$VSERVER_NAME" "$(basename "$1")" +} + +function _netnsProcessSingleGateway() { + local iface + local gw + + getFileValue gw "${2}/gw" "${2}/../gw" + [ -n "$gw" ] || return 0 + + iface="$(netnsCreateIfaceName "$2")" + _addInterfaceCmd IP_ROUTE default via "$gw" dev "$iface" +} + +function _netnsFilterNetnsUmount() { + local args=( "$@" ) + + while : + do + case $1 in + --) shift; break;; + -*) shift;; + net:*|/run/netns/*) return 0;; + *) break;; + esac + done + + ${_REAL_UMOUNT} "${opts[@]}" +} + +function _netnsWaitForDad() { + local waiting + + while ip -6 -o addr show tentative | grep -q ' scope global '; do + sleep 1 + waiting=$((waiting+1)) + if [ $waiting -ge $1 ]; then + echo "Warning: IPv6 addresses still tentative after ${waiting} seconds; continuing..." + return 0 + fi + done +} + + +# +# monkey patching +# + +function save_function() { + local ORIG_FUNC=$(declare -f $1) + local NEWNAME_FUNC="$2${ORIG_FUNC#$1}" + eval "$NEWNAME_FUNC" +} + +save_function _generateInterfaceOptions __netns_realGenerateInterfaceOptions +function _generateInterfaceOptions() { + __netns_realGenerateInterfaceOptions "$@" + ret="$?" + + # add commands for default route + for net in "$VSERVER_DIR/netns/"*; do + test -d "$net" || continue + test ! -e "${net}/disabled" || continue + + _netnsProcessSingleGateway "$net" + done + + return "$ret" +} + +save_function _namespaceCleanup __netns_realNamespaceCleanup +function _namespaceCleanup() { + _REAL_UMOUNT="${_UMOUNT}" + _UMOUNT="_netnsFilterNetnsUmount" + + __netns_realNamespaceCleanup "$@" + ret="$?" + + _UMOUNT="${_REAL_UMOUNT}" + return "$ret" +} + +save_function enableInterfaces __netns_realEnableInterfaces +function enableInterfaces() { + __netns_realEnableInterfaces "$@" + ret="$?" + + # It is unpossible to bind on very recently added IPv6 addresses. + # They have to pass the duplicate address detection (dad) before + # they could be used, so we wait here before continuing. + netnsWaitForDad() + + return "$ret" +} -- cgit v1.2.3-1-g7c22