Skip to content

Instantly share code, notes, and snippets.

@gowatana
Last active August 4, 2022 18:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gowatana/d4ab2df0a4b41f45623d320c2c5c555b to your computer and use it in GitHub Desktop.
Save gowatana/d4ab2df0a4b41f45623d320c2c5c555b to your computer and use it in GitHub Desktop.
#!/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
@gowatana
Copy link
Author

下記の投稿むけ。
Nutanix CE の Open vSwitch ブリッジ チェーンを整形出力してみる。
https://blog.ntnx.jp/entry/2022/07/31/224708

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment