cloudstack/scripts/vm/network/vnet/modifyvlan.sh

198 lines
4.0 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> -d <delete bridge>(true | false)\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
echo 1 > /proc/sys/net/ipv6/conf/$vlanDev/disable_ipv6
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
# disable IPv6
echo 1 > /proc/sys/net/ipv6/conf/$vlanDev/disable_ipv6
# 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
echo 1 > /proc/sys/net/ipv6/conf/$vlanBr/disable_ipv6
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
# disable IPv6
echo 1 > /proc/sys/net/ipv6/conf/$vlanBr/disable_ipv6
# 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
local deleteBr=$4
if [ $deleteBr == "true" ]
then
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
fi
return 0
}
op=
vlanId=
deleteBr="true"
option=$@
while getopts 'o:v:p:b:d:' 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"
;;
d) dflag=1
deleteBr="$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 $deleteBr
# Always exit with success
exit 0
fi
fi