#!/bin/bash
#************輸出可執行任務選項************************
echo -e "\033[31m\033[1m"
echo ""
echo "ScriptName:ChaosBlade"
echo "ScriptVersion: V1.0"
echo ""
echo -e "\033[31m\033[0m"
# 開啓選項高亮顯示
echo -e "\033[40;32m\033[1m"
echo " *** 請輸入要執行任務的代號 ***"
echo " *** 0.退出程序 ***"
echo " *** 1.安裝chaosblade ***"
echo " *** 2.模擬CPU負載 ***"
echo " *** 3.模擬IO負載 ***"
echo " *** 4.模擬端口不通 ***"
echo " *** 5.模擬丟包 ***"
echo " *** 6.模擬網絡延時 ***"
echo " *** 22.恢復CPU負載 ***"
echo " *** 33.恢復IO負載 ***"
echo " *** 44.恢復端口 ***"
echo " *** 55.恢復丟包 ***"
echo " *** 66.恢復網絡延時 ***"
echo " *** 99.查看任務代號 ***"
echo -e "\033[40;32m\033[0m"
out=99
while ((out != 0))
do
#*************Model層***************************
#開啓高亮顯示
echo -e "\033[40;35m\033[1m"
read -p "Please select the task execution code:" id
function action()
{
isNumber $id
number=$?
if [ $number -eq 1 ];then
task_id $id
echo "Successful submission code is $id"
else
echo -e "\033[31m\033[1m"
echo "ERROR:請輸入正確的任務代號!!"
echo -e "\033[31m\033[0m"
fi
}
#關閉高亮顯示
echo -e "\033[40;35m\033[0m"
SOURCE=$(cd $(dirname $0); pwd)
TARADDRESS=/usr/local/src/
SRCADDRESS=/usr/local/chaosblade
EXECUTEADDRESS=/usr/local/chaosblade/chaosblade-0.2.0
# 校驗用戶輸入的ID是否正確
function task_id()
{
case $1 in
0) echo '您選擇了退出程序-->程序已正常退出-->期待您的下次使用☺'
out=$id
exitcb $id
;;
1) echo '您選擇了安裝chaosblade'
install
;;
2) echo '您選擇了模擬CPU負載'
cpu
;;
3) echo '您選擇了模擬IO負載'
read -p "請輸入模擬IO的size、count、timeout數值[多參數用空格隔開]:" size count timeout
io $size $count $timeout
;;
4) echo '您選擇了模擬端口不通'
read -p "請輸入需要模擬的端口號:" ports
port $ports
;;
5) echo '您選擇了模擬模擬丟包'
read -p "請輸入模擬的網卡名稱interface、丟包percent數值[多參數用空格隔開]:" network lostpk
lostpackage $network $lostpk
;;
6) echo '您選擇了模擬網絡延時'
read -p "請輸入網卡名稱interface、網絡延時時間time(ms)[多參數用空格隔開]:" network delay
netWorkDelay $network $delay
;;
22) echo '您選擇了恢復CPU負載'
cpuRecovery
;;
33) echo '您選擇了恢復IO負載'
ioRecovery
;;
44) echo '您選擇了恢復端口不通'
portRecovery
;;
55) echo '您選擇了恢復模擬丟包'
lostpackageRecovery
;;
66) echo '您選擇了恢復網絡延時'
netWorkDelayRecovery
;;
99) echo '您選擇了查看任務代號'
taskOption
;;
*) echo 'erro:請輸入任務代號1~7'
;;
esac
}
#*************Control層***************************
# 安裝chaosblade 函數
function install()
{
chaosPath
existTarFile
existTarfilecode=$?
executionFile
executefilecode=$?
if [ $existTarfilecode -eq 1 ]; then
echoGreen
echo "successful:服務已存在無需構建,可以直接使用哦"
echoDess
else
#TODO 將這個下載文件改成本地移動文件到目標位置,與下載文件相比速度更快更穩定。
cp $SOURCE/source/chaosblade-0.2.0.linux-amd64.tar.gz $TARADDRESS
echoGreen
echo "-------------------------------------------"
echo "服務構建中時間可能較長您可以稍作休息啦^_^"
state
echo ""
echo "-------------------------------------------"
echo "服務構建成功,正在啓動中>--<"
echoDess
fi
if [ $executefilecode -eq 1 ]; then
echoGreen
echo "-------------------------------------------"
echo "File Ready Go of Chaosblade 服務啓動成功!!"
echoDess
else
cd $TARADDRESS
cp chaosblade-0.2.0.linux-amd64.tar.gz ../chaosblade/
cd $SRCADDRESS
tar zxvf chaosblade-0.2.0.linux-amd64.tar.gz
rm -rf chaosblade-0.2.0.linux-amd64.tar.gz
echoGreen
echo ""
echo "------------------------------------------"
echo "File Ready Go of Chaosblade 服務啓動成功!!"
echoGreen
fi
}
#------------------------------
# 模擬CPU負載函數
function cpu()
{
cd $EXECUTEADDRESS
json=`./blade create cpu fullload`
awkjson $json
}
# 恢復CPU負載函數
function cpuRecovery()
{
cd $EXECUTEADDRESS
./blade destroy $recoverycode
}
#------------------------------
# 模擬IO負載函數
function io()
{
cd $EXECUTEADDRESS
#TODO 執行命令的參數改爲接收用戶輸入的參數
json=`./blade create disk burn --write --read --size $1 --count $2 --timeout $3`
awkjson $json
}
# 恢復IO負載函數
function ioRecovery()
{
cd $EXECUTEADDRESS
./blade destroy $recoverycode
}
#------------------------------
#模擬端口不通
function port()
{
cd $EXECUTEADDRESS
json=`./blade create network drop --local-port $1`
awkjson $json
}
#恢復端口不通
function portRecovery()
{
cd $EXECUTEADDRESS
./blade destroy $recoverycode
}
#------------------------------
#模擬丟包
function lostpackage()
{
cd $EXECUTEADDRESS
json=`./blade create network loss --interface $1 --percent $2`
awkjson $json
}
#恢復丟包
function lostpackageRecovery()
{
cd $EXECUTEADDRESS
./blade destroy $recoverycode
}
#------------------------------
#模擬網絡延遲
function netWorkDelay()
{
cd $EXECUTEADDRESS
json=`./blade create network delay --interface $1 --time $2`
awkjson $json
}
#恢復網絡延時
function netWorkDelayRecovery()
{
cd $EXECUTEADDRESS
./blade destroy $recoverycode
}
#*************工具類util***********************************
#判斷本地src目錄是否存在ChaoBlade的tar包
function existTarFile()
{
file="chaosblade-0.2.0.linux-amd64.tar.gz"
cd $TARADDRESS
# -f 參數判斷 $file 是否存在
if [ -f "$file" ]; then
return 1
else
return 0
fi
}
#判斷本地chaosblade目錄下是否存在ChaoBlade可執行文件
function executionFile()
{
file="chaosblade-0.2.0"
cd $SRCADDRESS
if [ -d "$file" ]; then
return 1
else
return 0
fi
}
#判斷本篤local目錄下chaosblade文件夾是否存在
function chaosPath()
{
cd /usr/local
chaofolder="chaosblade"
if [ ! -d "$chaofolder" ]; then
mkdir "$chaofolder"
fi
}
#echo輸出添加效果
function echoGreen()
{
echo -e "\033[40;32m\033[1m"
}
#echo去掉效果
function echoDess()
{
echo -e "\033[40;32m\033[0m"
}
#時間計時器工具實現等待安裝程序進度效果
function state()
{
#TODO 這個循環沒有起作用
for i in {1..100}
do
sleep 0.1s
echo -ne "當前安裝進度######################——> $i \r"
done
}
#awk處理json數據獲取指定的數據
function awkjson()
{
#需要處理的數據
jsoncode=$1
echo $jsoncode
recoverycode=`echo $jsoncode | awk -F'"' '{print $(NF-1)}'|awk -F "}" '{print $1}'`
}
#退出程序
function exitcb()
{
if [ $1 -eq 0 ]; then
break
fi
}
#任務列表項顯示
function taskOption()
{
# 開啓選項高亮顯示
echo -e "\033[40;32m\033[1m"
echo " *** 請輸入要執行任務的代號 ***"
echo " *** 0.退出程序 ***"
echo " *** 1.安裝chaosblade ***"
echo " *** 2.模擬CPU負載 ***"
echo " *** 3.模擬IO負載 ***"
echo " *** 4.模擬端口不通 ***"
echo " *** 5.模擬丟包 ***"
echo " *** 6.模擬網絡延時 ***"
echo " *** 22.恢復CPU負載 ***"
echo " *** 33.恢復IO負載 ***"
echo " *** 44.恢復端口 ***"
echo " *** 55.恢復丟包 ***"
echo " *** 66.恢復網絡延時 ***"
echo " *** 99.查看任務代號 ***"
}
#判斷輸入的是否爲純數字
function isNumber()
{
if [ -n "$(echo $1| sed -n "/^[0-9]\+$/p")" ];then
return 1
else
return 0
fi
}
#*************init層*********************************
action
done