# Made network-bridge script work on ALL systems missing ifup/down.
# This is done by defining ifup/down both to ''false'' when
they''re
# missing; then instead of attempting to parse the IP params from
# the kernel command line, we get them from ''ip'' instead. So
this
# works even with (for example) ip=dhcp on the kernel command line.
#
# Also made a few minor syntax changes (in particular, replaced "=="
# with "=", and ">&foo" with ">foo
2>foo") so this works with more
# limited shells.
#
# Signed-off-by: Ben Thomas <bjthomas3@gmail.com>
#
diff -Nru examples.orig/network-bridge examples/network-bridge
--- examples.orig/network-bridge 2005-12-15 10:48:47.000000000 -0500
+++ examples/network-bridge 2005-12-15 10:51:20.000000000 -0500
@@ -68,48 +68,19 @@
vdev="veth${vifnum}"
vif0="vif0.${vifnum}"
-legacy_mask_to_prefix() {
- mask=$1
- first=${mask%%.*}
- second=${mask#*.}
- third=${second#*.}
- fourth=${third#*.}
- second=${second%%.*}
- third=${third%%.*}
- declare -i INT FULLMASK BIT
- INT=$((((($first*256)+$second)*256+$third)*256+$fourth))
- FULLMASK=4294967295
- BIT=1
- for bit in `seq 32 -1 0`; do
- if test $FULLMASK -eq $INT; then PREFIX=$bit; return; fi
- FULLMASK=$(($FULLMASK-$BIT))
- BIT=$((BIT*2))
- done
- echo "ERROR converting netmask $mask to prefix"
- exit 1
-}
-
-parse_kernel_ip() {
- if egrep ''ip=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:''
/proc/cmdline; then
- kip=`sed -e
''s!.*ip=\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\):.*!\1!''
/proc/cmdline`
- kmask=`sed -e ''s!.*ip=[^:]*:[^:]*:[^:]*:\([^:]*\):.*!\1!''
/proc/cmdline`
- kgate=`sed -e ''s!.*ip=[^:]*:[^:]*:\([^:]*\):.*!\1!''
/proc/cmdline`
- fi
+get_ip_info() {
+ addr_pfx=`ip addr show dev $1 | egrep ''^ *inet'' | sed -e
''s/ *inet //''
-e ''s/ .*//''`
+ gateway=`ip route show dev $1 | fgrep default | sed ''s/default via
//''`
}
-
+
do_ifup() {
if ! ifup $1 ; then
- if [ ${kip} ] ; then
- # use the addresses we grocked from /proc/cmdline
- if [ -z "${kmask}" ]; then
- PREFIX=32
- else
- legacy_mask_to_prefix ${kmask}
- fi
+ if [ ${addr_pfx} ] ; then
+ # use the info from get_ip_info()
ip addr flush $1
- ip addr add ${kip}/${PREFIX} dev $1
+ ip addr add ${addr_pfx} dev $1
ip link set dev $1 up
- [ ${kgate} ] && ip route add default via ${kgate}
+ [ ${gateway} ] && ip route add default via ${gateway}
fi
fi
}
@@ -171,7 +142,7 @@
#
link_exists()
{
- if ip link show "$1" >&/dev/null
+ if ip link show "$1" >/dev/null 2>/dev/null
then
return 0
else
@@ -231,7 +202,7 @@
}
op_start () {
- if [ "${bridge}" == "null" ] ; then
+ if [ "${bridge}" = "null" ] ; then
return
fi
@@ -259,9 +230,8 @@
preiftransfer ${netdev}
transfer_addrs ${netdev} ${vdev}
if ! ifdown ${netdev}; then
- # If ifdown fails, take the IP details from the kernel command
- # line.
- parse_kernel_ip
+ # If ifdown fails, remember the IP details.
+ get_ip_info ${netdev}
ip link set ${netdev} down
ip addr flush ${netdev}
fi
@@ -283,13 +253,13 @@
transfer_routes ${netdev} ${bridge}
fi
- if [ ${antispoof} == ''yes'' ] ; then
+ if [ ${antispoof} = ''yes'' ] ; then
antispoofing
fi
}
op_stop () {
- if [ "${bridge}" == "null" ]; then
+ if [ "${bridge}" = "null" ]; then
return
fi
if ! link_exists "$bridge"; then
@@ -301,7 +271,7 @@
mac=`ip link show ${netdev} | grep ''link\/ether'' | sed -e
''s/.*ether
\(..:..:..:..:..:..\).*/\1/''`
transfer_addrs ${netdev} ${pdev}
if ! ifdown ${netdev}; then
- parse_kernel_ip
+ get_ip_info ${netdev}
fi
ip link set ${netdev} down arp off
ip link set ${netdev} addr fe:ff:ff:ff:ff:ff
diff -Nru examples.orig/xen-network-common.sh examples/xen-network-common.sh
--- examples.orig/xen-network-common.sh 2005-12-15 10:48:47.000000000-0500
+++ examples/xen-network-common.sh 2005-12-15 10:52:38.000000000 -0500
@@ -42,7 +42,7 @@
{
/sbin/ifup ${HWD_CONFIG_0} $1
}
-elif ! which ifup >&/dev/null
+elif ! which ifup >/dev/null 2>/dev/null
then
if [ -e /etc/conf.d/net ]
then
@@ -59,9 +59,18 @@
/etc/init.d/net.$1 stop
}
else
- logger -p "daemon.crit" -- \
- "You don''t have ifup and don''t seem to be running
Gentoo either!"
- exit 1
+ preiftransfer()
+ {
+ true
+ }
+ ifup()
+ {
+ false
+ }
+ ifdown()
+ {
+ false
+ }
fi
else
preiftransfer()
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
Ian Pratt
2005-Dec-29 22:25 UTC
RE: [Xen-devel] make network-bridge work in more environments
> # Made network-bridge script work on ALL systems missing ifup/down. > # This is done by defining ifup/down both to ''false'' when they''re > # missing; then instead of attempting to parse the IP params from > # the kernel command line, we get them from ''ip'' instead. So this > # works even with (for example) ip=dhcp on the kernel command line. > # > # Also made a few minor syntax changes (in particular, replaced "==" > # with "=", and ">&foo" with ">foo 2>foo") so this works with more > # limited shells.I like this patch, but how well tested is it? Hacking the bridge script generally brings nothing but pain as users of all sorts of distro you''ve never even heard of start complaining... Ian> # Signed-off-by: Ben Thomas <bjthomas3@gmail.com> > # > diff -Nru examples.orig/network-bridge examples/network-bridge > --- examples.orig/network-bridge 2005-12-15 10:48: > 47.000000000 -0500 > +++ examples/network-bridge 2005-12-15 10:51:20.000000000 -0500 > @@ -68,48 +68,19 @@ > vdev="veth${vifnum}" > vif0="vif0.${vifnum}" > > -legacy_mask_to_prefix() { > - mask=$1 > - first=${mask%%.*} > - second=${mask#*.} > - third=${second#*.} > - fourth=${third#*.} > - second=${second%%.*} > - third=${third%%.*} > - declare -i INT FULLMASK BIT > - INT=$((((($first*256)+$second)*256+$third)*256+$fourth)) > - FULLMASK=4294967295 > - BIT=1 > - for bit in `seq 32 -1 0`; do > - if test $FULLMASK -eq $INT; then PREFIX=$bit; return; fi > - FULLMASK=$(($FULLMASK-$BIT)) > - BIT=$((BIT*2)) > - done > - echo "ERROR converting netmask $mask to prefix" > - exit 1 > -} > - > -parse_kernel_ip() { > - if egrep ''ip=[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:'' /proc/cmdline; then > - kip=`sed -e > ''s!.*ip=\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\):.*!\1!'' /proc/cmdline` > - kmask=`sed -e > ''s!.*ip=[^:]*:[^:]*:[^:]*:\([^:]*\):.*!\1!'' /proc/cmdline` > - kgate=`sed -e ''s!.*ip=[^:]*:[^:]*:\([^:]*\):.*!\1!'' > /proc/cmdline` > - fi > +get_ip_info() { > + addr_pfx=`ip addr show dev $1 | egrep ''^ *inet'' | sed -e > ''s/ *inet //'' -e ''s/ .*//''` > + gateway=`ip route show dev $1 | fgrep default | sed > ''s/default via //''` > } > - > + > do_ifup() { > if ! ifup $1 ; then > - if [ ${kip} ] ; then > - # use the addresses we grocked from /proc/cmdline > - if [ -z "${kmask}" ]; then > - PREFIX=32 > - else > - legacy_mask_to_prefix ${kmask} > - fi > + if [ ${addr_pfx} ] ; then > + # use the info from get_ip_info() > ip addr flush $1 > - ip addr add ${kip}/${PREFIX} dev $1 > + ip addr add ${addr_pfx} dev $1 > ip link set dev $1 up > - [ ${kgate} ] && ip route add default via ${kgate} > + [ ${gateway} ] && ip route add default via ${gateway} > fi > fi > } > @@ -171,7 +142,7 @@ > # > link_exists() > { > - if ip link show "$1" >&/dev/null > + if ip link show "$1" >/dev/null 2>/dev/null > then > return 0 > else > @@ -231,7 +202,7 @@ > } > > op_start () { > - if [ "${bridge}" == "null" ] ; then > + if [ "${bridge}" = "null" ] ; then > return > fi > > @@ -259,9 +230,8 @@ > preiftransfer ${netdev} > transfer_addrs ${netdev} ${vdev} > if ! ifdown ${netdev}; then > - # If ifdown fails, take the IP details from the > kernel command > - # line. > - parse_kernel_ip > + # If ifdown fails, remember the IP details. > + get_ip_info ${netdev} > ip link set ${netdev} down > ip addr flush ${netdev} > fi > @@ -283,13 +253,13 @@ > transfer_routes ${netdev} ${bridge} > fi > > - if [ ${antispoof} == ''yes'' ] ; then > + if [ ${antispoof} = ''yes'' ] ; then > antispoofing > fi > } > > op_stop () { > - if [ "${bridge}" == "null" ]; then > + if [ "${bridge}" = "null" ]; then > return > fi > if ! link_exists "$bridge"; then > @@ -301,7 +271,7 @@ > mac=`ip link show ${netdev} | grep ''link\/ether'' | sed > -e ''s/.*ether \(..:..:..:..:..:..\).*/\1/''` > transfer_addrs ${netdev} ${pdev} > if ! ifdown ${netdev}; then > - parse_kernel_ip > + get_ip_info ${netdev} > fi > ip link set ${netdev} down arp off > ip link set ${netdev} addr fe:ff:ff:ff:ff:ff > diff -Nru examples.orig/xen-network-common.sh > examples/xen-network-common.sh > --- examples.orig/xen-network-common.sh 2005-12-15 > 10:48:47.000000000 -0500 > +++ examples/xen-network-common.sh 2005-12-15 > 10:52:38.000000000 -0500 > @@ -42,7 +42,7 @@ > { > /sbin/ifup ${HWD_CONFIG_0} $1 > } > -elif ! which ifup >&/dev/null > +elif ! which ifup >/dev/null 2>/dev/null > then > if [ -e /etc/conf.d/net ] > then > @@ -59,9 +59,18 @@ > /etc/init.d/net.$1 stop > } > else > - logger -p "daemon.crit" -- \ > - "You don''t have ifup and don''t seem to be running > Gentoo either!" > - exit 1 > + preiftransfer() > + { > + true > + } > + ifup() > + { > + false > + } > + ifdown() > + { > + false > + } > fi > else > preiftransfer() > > > > > > > > >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Aron Griffis
2006-Jan-07 00:17 UTC
Re: [Xen-devel] make network-bridge work in more environments
B Thomas wrote: [Thu Dec 29 2005, 10:58:04AM EST]> # Also made a few minor syntax changes (in particular, replaced "==" > # with "=", and ">&foo" with ">foo 2>foo") so this works with more > # limited shells....> - if [ ${antispoof} == ''yes'' ] ; then > + if [ ${antispoof} = ''yes'' ] ; thenNit: since you''re changing this line already, it would be good to quote the LHS. -- Aron Griffis hp Open Source & Linux Organization R&D _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Ewan Mellor
2006-Jan-10 14:42 UTC
Re: [Xen-devel] make network-bridge work in more environments
On Thu, Dec 29, 2005 at 10:58:04AM -0500, B Thomas wrote:> # Made network-bridge script work on ALL systems missing ifup/down. > # This is done by defining ifup/down both to ''false'' when they''re > # missing; then instead of attempting to parse the IP params from > # the kernel command line, we get them from ''ip'' instead. So this > # works even with (for example) ip=dhcp on the kernel command line. > # > # Also made a few minor syntax changes (in particular, replaced "==" > # with "=", and ">&foo" with ">foo 2>foo") so this works with more > # limited shells. > # > # Signed-off-by: Ben Thomas <[1]bjthomas3@gmail.com>Applied, thank you. Ewan. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel