From 0d52009f7ea77e739fca105988c01337dfeb04d5 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sat, 28 Sep 2013 18:33:26 +0200 Subject: initial commit --- vserver.netns | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100755 vserver.netns (limited to 'vserver.netns') diff --git a/vserver.netns b/vserver.netns new file mode 100755 index 0000000..a3e81eb --- /dev/null +++ b/vserver.netns @@ -0,0 +1,141 @@ +#!/bin/bash + +: ${UTIL_VSERVER_VARS:=/usr/lib/util-vserver/util-vserver-vars.netns} +test -e "$UTIL_VSERVER_VARS" || { + echo $"Can not find util-vserver installation (the file '$UTIL_VSERVER_VARS' would be expected); aborting..." >&2 + exit 1 +} +. "$UTIL_VSERVER_VARS" +. "$_LIB_FUNCTIONS" +. $__PKGLIBDIR/vserver.functions + +function _processSingleNetwork() { + local dev + local iface + local vlan + local mac + + getFileValue dev "${2}/dev" "${2}/../dev" + [ -n "$dev" ] || return 1 + + iface="$(netnsCreateIfaceName "$2")" + getFileValue vlan "${2}/vlan" + + case "$1" in + add) + if [ ! -e "${2}/nocleanup" ]; then + $_IP link show dev "$iface" >/dev/null 2>&1 && $_IP link del "$iface" + $_IP netns exec "$VSERVER_NAME" $_IP link show dev "$iface" >/dev/null 2>&1 && $_IP netns exec "$VSERVER_NAME" $_IP link del "$iface" + fi + + if [ -z "$vlan" ]; then + $_IP link add link "$dev" name "$iface" type macvlan mode bridge + else + $_IP link add link "$dev" name "$iface" type vlan id "$vlan" + fi + + getFileValue mac "${2}/mac" + [ -n "$mav" ] || mac="$(netnsCreateMac "$2")" + + $_IP link set dev "$iface" netns "$VSERVER_NAME" + $_IP netns exec "$VSERVER_NAME" $_IP link set dev "$iface" address "$mac" + $_IP netns exec "$VSERVER_NAME" $_VPROCUNHIDE + ;; + + remove) + $_IP netns exec "$VSERVER_NAME" $_IP link del "$iface" + ;; + esac +} + +# preserve args +ARGS=( "$@" ) +SELF=( "$0" ) + +# skip arguments starting with - +while : +do + case "$1" in + --) + SELF=( "${SELF[@]}" "$1" ) + shift + break + ;; + -*) + SELF=( "${SELF[@]}" "$1" ) + shift + ;; + *) + break + ;; + esac +done + +VSERVER_NAME="$1" +ACTION="$2" +NETNS=() + +_setVserverDir "$VSERVER_NAME" + +[ -d "${VSERVER_DIR}/netns/" ] && _USE_NETNS="1" + +if [[ "$ACTION" == "start" && -n "${_USE_NETNS}" ]]; then + pushd "$VSERVER_DIR" >/dev/null + execScriptlets "$VSERVER_DIR" "$VSERVER_NAME" pre-netns + popd >/dev/null + + # create and init netns + $_IP netns list | grep -q "^${VSERVER_NAME}\$" || $_IP netns add "$VSERVER_NAME" + $_IP netns exec "$VSERVER_NAME" $_IP link set dev lo up + + for net in "$VSERVER_DIR/netns/"*; do + test -d "$net" || continue + test ! -e "${net}/disabled" || continue + + _processSingleNetwork add "$net" + done +fi + +if [[ "$ACTION" == "start" || + "$ACTION" == "stop" || + "$ACTION" == "enter" || + "$ACTION" == "exec" || + "$ACTION" == "suexec" ]] +then + if [ -n "${_USE_NETNS}" ]; then + # enter netns + NETNS=( $_IP netns exec "$VSERVER_NAME" ) + fi +fi + +if [[ "$ACTION" == "restart" ]]; then + "${SELF[@]}" --sync "$VSERVER_NAME" stop + exec "${SELF[@]}" "$VSERVER_NAME" start +fi + + +# prepare for executing real _VSERVER +export _USE_NETNS +export UTIL_VSERVER_VARS + +if [[ "$ACTION" != "stop" ]]; then + exec "${NETNS[@]}" "$_REAL_VSERVER" "${ARGS[@]}" +fi + + +# stop need to do something after the stop, so no exec here +"${NETNS[@]}" "$_REAL_VSERVER" "${ARGS[@]}" +ret=$? + +if [ -n "${_USE_NETNS}" ]; then + for net in "${VSERVER_DIR}/netns/"*; do + test -d "$net" || continue + test ! -e "${net}/disabled" || continue + + _processSingleNetwork remove "$net" + done + + $_IP netns delete "$VSERVER_NAME" +fi + +exit $ret -- cgit v1.2.3-1-g7c22