| #!/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 |