cloudstack/scripts/vm/network/vnet/modifyvlan.sh
Wido den Hollander 4d7e95ec04 kvm: Use 'ip' instead of 'brctl' (#3623)
* kvm: Use 'ip' instead of 'brctl'

The command 'brctl' is deprecated and should no longer be used.

iproute2 supports all the features we need and therefor we should use
this instead of the old commands.

Feature wise this does not change anything. It just makes the code more
robust towards the future.

Signed-off-by: Wido den Hollander <wido@widodh.nl>

* kvm/modifyvlan: Use 'ip' instead of 'brctl'

brctl is deprecated and by using iproute2 we are future-proof

Signed-off-by: Wido den Hollander <wido@widodh.nl>
2019-11-11 21:51:46 +05:30

186 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# $Id: modifyvlan.sh 11601 2010-08-11 17:26:15Z kris $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.refactor/java/scripts/vm/network/vnet/modifyvlan.sh $
# modifyvlan.sh -- adds and deletes VLANs from a Routing Server
# set -x
usage() {
printf "Usage: %s: -o <op>(add | delete) -v <vlan id> -p <pif> -b <bridge name>\n"
}
addVlan() {
local vlanId=$1
local pif=$2
local vlanDev=$pif.$vlanId
local vlanBr=$3
if [ ! -d /sys/class/net/$vlanDev ]
then
ip link add link $pif name $vlanDev type vlan id $vlanId > /dev/null
ip link set $vlanDev up
if [ $? -gt 0 ]
then
# race condition that someone already creates the vlan
if [ ! -d /sys/class/net/$vlanDev ]
then
printf "Failed to create vlan $vlanId on pif: $pif."
return 1
fi
fi
fi
# is up?
ip link set $vlanDev up > /dev/null 2>/dev/null
if [ ! -d /sys/class/net/$vlanBr ]
then
ip link add name $vlanBr type bridge
ip link set $vlanBr up
if [ $? -gt 0 ]
then
if [ ! -d /sys/class/net/$vlanBr ]
then
printf "Failed to create br: $vlanBr"
return 2
fi
fi
fi
#pif is eslaved into vlanBr?
ls /sys/class/net/$vlanBr/brif/ |grep -w "$vlanDev" > /dev/null
if [ $? -gt 0 ]
then
ip link set $vlanDev master $vlanBr
if [ $? -gt 0 ]
then
ls /sys/class/net/$vlanBr/brif/ |grep -w "$vlanDev" > /dev/null
if [ $? -gt 0 ]
then
printf "Failed to add vlan: $vlanDev to $vlanBr"
return 3
fi
fi
fi
# is vlanBr up?
ip link set $vlanBr up > /dev/null 2>/dev/null
return 0
}
deleteVlan() {
local vlanId=$1
local pif=$2
local vlanDev=$pif.$vlanId
local vlanBr=$3
ip link delete $vlanDev type vlan > /dev/null
if [ $? -gt 0 ]
then
printf "Failed to del vlan: $vlanId"
return 1
fi
ip link set $vlanBr down
if [ $? -gt 0 ]
then
return 1
fi
ip link delete $vlanBr type bridge
if [ $? -gt 0 ]
then
printf "Failed to del bridge $vlanBr"
return 1
fi
return 0
}
op=
vlanId=
option=$@
while getopts 'o:v:p:b:' OPTION
do
case $OPTION in
o) oflag=1
op="$OPTARG"
;;
v) vflag=1
vlanId="$OPTARG"
;;
p) pflag=1
pif="$OPTARG"
;;
b) bflag=1
brName="$OPTARG"
;;
?) usage
exit 2
;;
esac
done
# Check that all arguments were passed in
if [ "$oflag$vflag$pflag$bflag" != "1111" ]
then
usage
exit 2
fi
# Vlan module is loaded?
lsmod|grep ^8021q >& /dev/null
if [ $? -gt 0 ]
then
modprobe 8021q >& /dev/null
fi
if [ "$vlanId" -eq 4095 ]
then
exit 0
fi
if [ "$op" == "add" ]
then
# Add the vlan
addVlan $vlanId $pif $brName
# If the add fails then return failure
if [ $? -gt 0 ]
then
exit 1
fi
else
if [ "$op" == "delete" ]
then
# Delete the vlan
deleteVlan $vlanId $pif $brName
# Always exit with success
exit 0
fi
fi