Last active
August 4, 2022 18:11
-
-
Save gowatana/d4ab2df0a4b41f45623d320c2c5c555b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# auther: gowatana | |
# usage: | |
# AHV# bash ./format_ahv_open-vswitch.sh | |
# or | |
# AHV# ovs-vsctl show > output.txt | |
# # bash ./format_ahv_open-vswitch.sh output.txt | |
OVS_FORMAT_FILE=./ovs-vsctl_show_formatted.txt | |
BRIDGE_NAME_1=br0 | |
BRIDGE_NAME_2=br1 | |
PORT_INFO=1 | |
DEBUG=0 | |
# option: load manual "ovs-vsctl show" output text | |
OVS_VSCTL_SHOW_OUTPUT=$1 | |
#------------------------------------------------ | |
# set work variables | |
TEMP_DIR=./temp_ovs_fmt | |
OVS_SHOW_TEXT=$TEMP_DIR/ovs-vsctl_show.txt | |
OVS_BR_FILE=$TEMP_DIR/ovs_br_ | |
OVS_PORT_FILE=$TEMP_DIR/ovs_port_ | |
BRIDGE_LIST=$TEMP_DIR/bridge_list | |
BRIDGE_LIST_ALL=${BRIDGE_LIST}.all | |
BRIDGE_LIST_1ST=${BRIDGE_LIST}.1st | |
BRIDGE_LIST_MAIN=${BRIDGE_LIST}.main | |
BRIDGE_LIST_BR1=${BRIDGE_LIST}.br1 | |
BRIDGE_LIST_SUB=${BRIDGE_LIST}.sub | |
BRIDGE_LIST_WORK1=${BRIDGE_LIST}.work1 | |
BRIDGE_LIST_WORK2=${BRIDGE_LIST}.work2 | |
PEER_FILE=$TEMP_DIR/peer.txt | |
PORT_FILE=$TEMP_DIR/port.txt | |
PEER_ALL_FILE=$TEMP_DIR/peer.all.txt | |
CONNECTED_UPLINK_PORT_FILE=$TEMP_DIR/port.up.txt | |
CONNECTED_UPLINK_PEER_FILE=$TEMP_DIR/peer.up.txt | |
BRIDGE_BORDER=`for i in {1..60};do echo -n "="; done` | |
#------------------------------------------------ | |
# create temp directory | |
test -d $TEMP_DIR || mkdir -p $TEMP_DIR | |
#------------------------------------------------ | |
# get "ovs-vsctl show" | |
if [ -f "$OVS_VSCTL_SHOW_OUTPUT" ]; then | |
cat $OVS_VSCTL_SHOW_OUTPUT | grep -v ovs_version | sed 's/"//g' > $OVS_SHOW_TEXT | |
PORT_INFO=0 | |
else | |
ovs-vsctl show | grep -v ovs_version | sed 's/"//g' > $OVS_SHOW_TEXT | |
fi | |
#------------------------------------------------ | |
# split Bridge files | |
csplit -z -f $OVS_BR_FILE -n 2 $OVS_SHOW_TEXT /Bridge/ {*} > /dev/null | |
#------------------------------------------------ | |
# split Port files | |
for FILE in `ls $OVS_BR_FILE*` | |
do | |
if (grep -q Bridge $FILE); then | |
BR_NAME=$(grep Bridge $FILE | sed s/Bridge// | sed 's/\s//g' | sed 's/"//g') | |
OVS_PORT_FILE_TEMP="${OVS_PORT_FILE}${BR_NAME}_" | |
OVS_PORT_FILE_FIX=${OVS_PORT_FILE_TEMP}fixed | |
OVS_BR_HEADER=${OVS_PORT_FILE_TEMP}00 | |
csplit -z -f $OVS_PORT_FILE_TEMP -n 2 $FILE /Port/ {*} > /dev/null | |
# Header | |
cat $OVS_BR_HEADER > $OVS_PORT_FILE_FIX | |
# downlink port | |
for F in `ls ${OVS_PORT_FILE_TEMP}?? | grep -v _00$` | |
do | |
if(grep -q -E -e 'Port.*\.d$' -e "Port.*\.d\.${BRIDGE_NAME_1}"$ $F); then | |
cat $F >> $OVS_PORT_FILE_FIX | |
fi | |
done | |
# bridge name port | |
for F in `ls ${OVS_PORT_FILE_TEMP}?? | grep -v _00$` | |
do | |
if(grep -q -E "Port $BR_NAME"$ $F); then | |
cat $F >> $OVS_PORT_FILE_FIX | |
fi | |
done | |
# other ports | |
for F in `ls ${OVS_PORT_FILE_TEMP}?? | grep -v _00$` | |
do | |
if (grep -q -E -e 'Port.*\.d$' -e "Port.*\.d\.${BRIDGE_NAME_1}"$ $F) || \ | |
(grep -q -E 'Port.*\.u$|Port.*\.u\.' $F) || \ | |
(grep -q -E "Port $BR_NAME"$ $F) | |
then | |
true | |
else | |
cat $F >> $OVS_PORT_FILE_FIX | |
fi | |
done | |
# uplink port | |
for F in `ls ${OVS_PORT_FILE_TEMP}?? | grep -v _00$` | |
do | |
if(grep -q -E 'Port.*\.u$|Port.*\.u\.' $F); then | |
cat $F >> $OVS_PORT_FILE_FIX | |
fi | |
done | |
if [ $PORT_INFO -eq 1 ]; then | |
echo "" >> $OVS_PORT_FILE_FIX | |
ovs-ofctl show $BR_NAME | grep 'addr:' >> $OVS_PORT_FILE_FIX | |
fi | |
fi | |
done | |
#------------------------------------------------ | |
# output start | |
echo "AHV Host: `uname -n`" > $OVS_FORMAT_FILE | |
echo "DateTime: `date "+%Y %m/%d %H:%m:%S"`" >> $OVS_FORMAT_FILE | |
echo $BRIDGE_BORDER >> $OVS_FORMAT_FILE | |
ovs-appctl bond/list >> $OVS_FORMAT_FILE | |
echo $BRIDGE_BORDER >> $OVS_FORMAT_FILE | |
#------------------------------------------------ | |
# create bridge list | |
ls -1 ${OVS_PORT_FILE}*_fixed > $BRIDGE_LIST_ALL | |
> $BRIDGE_LIST_WORK1 | |
> $BRIDGE_LIST_WORK2 | |
# create BRIDGE_LIST_1ST | |
for FILE in `cat $BRIDGE_LIST_ALL` | |
do | |
if(grep -q "Bridge $BRIDGE_NAME_1"$ $FILE); then | |
echo $FILE > $BRIDGE_LIST_1ST | |
grep -v $FILE $BRIDGE_LIST_ALL > $BRIDGE_LIST_WORK2 | |
break | |
fi | |
done | |
cp $BRIDGE_LIST_WORK2 $BRIDGE_LIST_WORK1 | |
> $BRIDGE_LIST_WORK2 | |
# create BRIDGE_LIST_BR1 | |
> $BRIDGE_LIST_BR1 | |
for FILE in `cat $BRIDGE_LIST_WORK1` | |
do | |
if(grep -q "Bridge $BRIDGE_NAME_2"$ $FILE); then | |
echo $FILE > $BRIDGE_LIST_BR1 | |
else | |
echo $FILE >> $BRIDGE_LIST_WORK2 | |
fi | |
done | |
cp $BRIDGE_LIST_WORK2 $BRIDGE_LIST_WORK1 | |
> $BRIDGE_LIST_WORK2 | |
# add br1.local to BRIDGE_LIST_BR1 | |
for FILE in `cat $BRIDGE_LIST_WORK1` | |
do | |
if(grep -q "Bridge ${BRIDGE_NAME_2}.local"$ $FILE); then | |
echo $FILE >> $BRIDGE_LIST_BR1 | |
else | |
echo $FILE >> $BRIDGE_LIST_WORK2 | |
fi | |
done | |
cp $BRIDGE_LIST_WORK2 $BRIDGE_LIST_WORK1 | |
> $BRIDGE_LIST_WORK2 | |
# create BRIDGE_LIST_SUB | |
> $BRIDGE_LIST_SUB | |
for FILE in `cat $BRIDGE_LIST_WORK1` | |
do | |
if(grep -q -e "Bridge brSpan" -e "Bridge brAtlas" $FILE); then | |
echo $FILE >> $BRIDGE_LIST_SUB | |
else | |
echo $FILE >> $BRIDGE_LIST_WORK2 | |
fi | |
done | |
cp $BRIDGE_LIST_WORK2 $BRIDGE_LIST_WORK1 | |
> $BRIDGE_LIST_WORK2 | |
# create BRIDGE_LIST_MAIN | |
cp $BRIDGE_LIST_WORK1 $BRIDGE_LIST_MAIN | |
#------------------------------------------------ | |
# output 1st bridge | |
FILE=`cat $BRIDGE_LIST_1ST` | |
cat $FILE >> $OVS_FORMAT_FILE | |
# get next link | |
cat $FILE | grep patch -C2 | grep peer | sed 's|.*options: {peer=||' | sed 's|}||' | grep '\.d\.' > $PEER_FILE | |
PORT=`cat $PEER_FILE` | |
cat $FILE | grep $PORT -B3 | grep Port | sed "s|Port||g" | sed 's|\s||g' > $PORT_FILE | |
cp $PORT_FILE $CONNECTED_UPLINK_PORT_FILE | |
cp $PEER_FILE $CONNECTED_UPLINK_PEER_FILE | |
> $PORT_FILE | |
> $PEER_FILE | |
echo $BRIDGE_BORDER >> $OVS_FORMAT_FILE | |
#------------------------------------------------ | |
# br0 2nd chain and after | |
function output_next_bridge_chain(){ | |
> $BRIDGE_LIST_WORK1 | |
for FILE in `cat $BRIDGE_LIST_MAIN` | |
do | |
PORT=`cat $CONNECTED_UPLINK_PORT_FILE` | |
PEER=`cat $CONNECTED_UPLINK_PEER_FILE` | |
PRIV_BR_PEER=`cat $CONNECTED_UPLINK_PEER_FILE` | |
if (grep -q -E "Port $PRIV_BR_PEER"$ $FILE); then | |
CURRENT_DOWNLINK_PORT=`cat $CONNECTED_UPLINK_PEER_FILE` | |
CURRENT_DOWNLINK_PEER=`cat $CONNECTED_UPLINK_PORT_FILE` | |
PRIV_UPLINK_PORT=`cat $CONNECTED_UPLINK_PORT_FILE` | |
cat $FILE >> $OVS_FORMAT_FILE | |
echo $BRIDGE_BORDER >> $OVS_FORMAT_FILE | |
# get all peer port | |
cat $FILE | grep -C2 patch | grep peer | sed 's|.*options: {peer=||' | sed 's|}||' > $PEER_ALL_FILE | |
cat $PEER_ALL_FILE | grep "\.d" > $PEER_FILE | |
PEER=`cat $PEER_FILE` | |
# get exclude peer port | |
cat $PEER_FILE | grep -v $PRIV_UPLINK_PORT > ${PEER_FILE}.tmp | |
cp ${PEER_FILE}.tmp $PEER_FILE | |
# get next bridge port | |
PEER=`cat $PEER_FILE` | |
cat $FILE | grep -B3 "$PEER" | grep Port | sed "s|Port||g" | sed 's|\s||g' > $PORT_FILE | |
cp $PORT_FILE $CONNECTED_UPLINK_PORT_FILE | |
cp $PEER_FILE $CONNECTED_UPLINK_PEER_FILE | |
else | |
echo $FILE >> $BRIDGE_LIST_WORK1 | |
fi | |
done | |
cp $BRIDGE_LIST_WORK1 $BRIDGE_LIST_MAIN | |
} | |
while [ -s $BRIDGE_LIST_MAIN ] | |
do | |
output_next_bridge_chain | |
done | |
#------------------------------------------------ | |
# output 2nd Bridge (br1) | |
for FILE in `cat $BRIDGE_LIST_BR1` | |
do | |
cat $FILE >> $OVS_FORMAT_FILE | |
echo $BRIDGE_BORDER >> $OVS_FORMAT_FILE | |
done | |
#------------------------------------------------ | |
# output other bridges | |
for FILE in `cat $BRIDGE_LIST_SUB` | |
do | |
cat $FILE >> $OVS_FORMAT_FILE | |
echo $BRIDGE_BORDER >> $OVS_FORMAT_FILE | |
done | |
#------------------------------------------------ | |
# cleanup | |
if [ $DEBUG -eq 1 ]; then | |
echo "formatted output file: $OVS_FORMAT_FILE" | |
else | |
cat $OVS_FORMAT_FILE | |
rm -rf $TEMP_DIR | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
下記の投稿むけ。
Nutanix CE の Open vSwitch ブリッジ チェーンを整形出力してみる。
https://blog.ntnx.jp/entry/2022/07/31/224708