About this list Date view Thread view Subject view Author view Attachment view

From: Liam Helmer (linuxlists_at_thevenue.org)
Date: Wed 31 Mar 2004 - 02:41:14 BST


> The creation of the dummy devices is ugly and has races ('dummy0' is
> used by every 'vserver ... start' instance which conflicts with the
> parallel vserver startup). 'dummy<ctx>' would be ideally but is not
> supported by the kernel.

I've attached what I was thinking, roughly. Yes, this is part of a much
larger script... I'll share it with everyone when it's more complete.
One problem with this code is that there's no real way of dumping the
vserver interfaces when you're done. I can't think of others off the top
of my head, but they're probably there.

vstohex () {
        [ -n "$1" ] || return 1
        local oct1=$((${1} / 256))
        local oct2=$((${1} % 256))
        local -a out=()
        for seg in $oct1 $oct2 ; do
                hex1=$(($seg / 16))
                [ "$hex1" = "15" ] && hex1=f
                [ "$hex1" = "14" ] && hex1=e
                [ "$hex1" = "13" ] && hex1=d
                [ "$hex1" = "12" ] && hex1=c
                [ "$hex1" = "11" ] && hex1=b
                [ "$hex1" = "10" ] && hex1=a
                hex2=$(($seg % 16))
                [ "$hex2" = "15" ] && hex2=f
                [ "$hex2" = "14" ] && hex2=e
                [ "$hex2" = "13" ] && hex2=d
                [ "$hex2" = "12" ] && hex2=c
                [ "$hex2" = "11" ] && hex2=b
                [ "$hex2" = "10" ] && hex2=a
                out[${#out[@]}]=$hex1$hex2
        done
        echo "${out[0]}:${out[1]}"
        }

                if [ - "${BUILD_VSIF}" ] && ! ip link ls ${VSERVER_NAME} 2> /dev/null
; then
                        olddummylist=($(ip link ls | gawk '$2 ~ /^dummy/ {print $2}' | sed
's/:$//g' | sort))
                        insmod -o new dummy
                        newdummylist=($(ip link ls | gawk '$2 ~ /^dummy/ {print $2}' | sed
's/:$//g' | sort))
                        if [ "${newdummylist[@]}" = "${olddummylist[@]}" ] ; then
                                ${LOGERROR} "Sorry, no dummy support in kernel!"
                        else
                                for nd in ${newdummylist[@]} ; do
                                        for od in ${olddummylist[@]} ; do
                                                [ "$nd" = "$od" ] && continue 2
                                        done
                                        dummylock=/var/lock/vserver/.lock.${nd}
                                        [ -f "$dummylock" ] && continue
                                        echo $$ >> $dummylock
                                        hexend=$(vstohex ${S_CONTEXT})
                                        mac="ff:ff:ff:ff:${hexend}"
                                        ip link set dev ${nd} address ${mac}
                                        nameif ${VSERVER_NAME} ${mac} || ${LOGERROR} "Problem setting up
the dummy interface"
                                        rm -f ${dummylock}
                                        break
                                done
                        fi
                fi
                if [ "$BUILD_VSIF" ] ; then
                        if ! ip link ls ${VSERVER_NAME} > /dev/null 2>&1 ; then
                                ${LOGERROR} "Dummy interface ${VSERVER_NAME} doesn't exist!"
                        else
                                ip addr flush ${VSERVER_NAME}
                                for ipaddr in ${IPROOT} ; do
                                        ip addr add dev ${VSERVER_NAME} $ipaddr
                                done
                        fi
                fi

vstohex () {
        [ -n "$1" ] || return 1
        local oct1=$((${1} / 256))
        local oct2=$((${1} % 256))
        local -a out=()
        for seg in $oct1 $oct2 ; do
                hex1=$(($seg / 16))
                [ "$hex1" = "15" ] && hex1=f
                [ "$hex1" = "14" ] && hex1=e
                [ "$hex1" = "13" ] && hex1=d
                [ "$hex1" = "12" ] && hex1=c
                [ "$hex1" = "11" ] && hex1=b
                [ "$hex1" = "10" ] && hex1=a
                hex2=$(($seg % 16))
                [ "$hex2" = "15" ] && hex2=f
                [ "$hex2" = "14" ] && hex2=e
                [ "$hex2" = "13" ] && hex2=d
                [ "$hex2" = "12" ] && hex2=c
                [ "$hex2" = "11" ] && hex2=b
                [ "$hex2" = "10" ] && hex2=a
                out[${#out[@]}]=$hex1$hex2
        done
        echo "${out[0]}:${out[1]}"
        }

                if [ "${BUILD_VSIF}" != "" ] && ! ip addr ls ${VSERVER_NAME} 2> /dev/null ; then
                        dummylist=($(ip link ls | gawk '$2 ~ /^dummy/ {print $2}' | sed 's/:$//g' | sort))
                        insmod -o new dummy
                        newdummylist=($(ip link ls | gawk '$2 ~ /^dummy/ {print $2}' | sed 's/:$//g' | sort))
                        if [ "${dummylist[@]}" = "${olddummylist[@]}" ] ; then
                                ${LOGERROR} "Sorry, no dummy support in kernel!"
                        else
                                for nd in ${newdummylist[@]} ; do
                                        for od in ${olddummylist} ; do
                                                [ "$nd" = "$od" ] && continue 2
                                        done
                                        dummylock=/var/lock/vserver/.lock.${nd}
                                        [ -f "$dummylock" ] && continue
                                        echo $$ >> $dummylock
                                        hexend=$(vstohex ${S_CONTEXT})
                                        mac="ff:ff:ff:ff:${hexend}"
                                        ip link set dev ${nd} address ${mac}
                                        nameif ${VSERVER_NAME} ${mac} || continue
                                        rm -f ${dummylock}
                                        break
                                done
                        fi
                fi
                if [ "$BUILD_VSIF" ] ; then
                        if ! ip link ls ${VSERVER_NAME} > /dev/null 2>&1 ; then
                                ${LOGERROR} "Dummy interface ${VSERVER_NAME} doesn't exist!"
                        else
                                ip addr flush ${VSERVER_NAME}
                                for ipaddr in ${IPROOT} ; do
                                        ip addr add dev ${VSERVER_NAME} $ipaddr
                                done
                        fi
                fi

_______________________________________________
Vserver mailing list
Vserver_at_list.linux-vserver.org
http://list.linux-vserver.org/mailman/listinfo/vserver


About this list Date view Thread view Subject view Author view Attachment view
[Next/Previous Months] [Main vserver Project Homepage] [Howto Subscribe/Unsubscribe] [Paul Sladen's vserver stuff]
Generated on Wed 31 Mar 2004 - 02:42:08 BST by hypermail 2.1.3