为了实现自动检测物理网卡,自动检测OVS网卡,自动添加任务计划,我对脚本进行了功能升级。
#!/bin/bash
#飞牛OS有线OVS网卡IP丢失自动修复脚本
#功能:
#1、检测到OVS网卡丢失时自动创建OVS网卡
#2、检测到OVS网卡无IP时自动执行dhclient获取IP,如果指定了IP就设置固定IP到OVS网卡
######全局变量######
version="v1.1" #脚本版本号
script_file="fix_ovs_network_$version.sh" #脚本文件名
phy_nic="" #物理网卡:如果预设了名称,不自动检测物理网卡名
ovs_nic="" #OVS网卡
ip_addr="" #自动检测到的IP
static_ip="" #固定IP:如果留空就默认自动获取IP
netmaks="24" #子网掩码:如果设置了固定IP,务必要填写子网掩码
gateway="" #网关IP:如果设置了固定IP,务必要填写网关IP
dns_server="223.5.5.5 8.8.8.8" #DNS服务器:如果设置了固定IP,务必要填写DNS服务器,多个DNS服务器之间可以空格
######**######
#字符颜色程序_黑色
function black(){
str_input=$1
echo -e "\\033[30m$str_input\033[0m\c"
}
#字符颜色程序_红色
function red(){
str_input=$1
echo -e "\\033[31m$str_input\033[0m\c"
}
#字符颜色程序_绿色
function green(){
str_input=$1
echo -e "\\033[32m$str_input\033[0m\c"
}
#字符颜色程序_**
function yellow(){
str_input=$1
echo -e "\\033[33m$str_input\033[0m\c"
}
#字符颜色程序_蓝色
function blue(){
str_input=$1
echo -e "\\033[34m$str_input\033[0m\c"
}
#字符颜色程序_紫色
function purple(){
str_input=$1
echo -e "\\033[35m$str_input\033[0m\c"
}
#字符颜色程序_天蓝色
function skyblue(){
str_input=$1
echo -e "\\033[36m$str_input\033[0m\c"
}
#字符颜色程序_白色
function white(){
str_input=$1
echo -e "\\033[37m$str_input\033[0m\c"
}
#操作系统名称、版本检测
function system_check(){
system_name=$(cat /etc/os-release | grep "NAME" | grep -v "_NAME" | awk -F '"' '{print$2}')
system_version=$(cat /etc/os-release | grep "VERSION_ID" | awk -F '"' '{print$2}' | awk -F "." '{print $1}')
yellow "操作系统名称: "; green "$system_name\n"
yellow "操作系统版本: "; green "$system_version\n"
}
#检测指定网卡的IP地址
#用法:check_ip 网卡名
function check_ip() {
# 获取网卡的IPv4地址(排除127.0.0.1/0.0.0.0)
ip_addr=$(ip addr show $1 | grep -Eo 'inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v '127.0.0.1' | grep -v '0.0.0.0' | awk '{print $2}')
if [ ! -z $ip_addr ]; then
#yellow "网卡"; blue $1; yellow "的IP地址: "; green "$ip_addr\n"
return 0
else
#yellow "网卡"; blue $1; yellow "的IP地址: "; red "未设置\n"
return 1
fi
}
#IP设置程序
#用法:configure_ip 网卡名
function configure_ip() {
if [ -z $1 ];then
red "没有输入网卡名\n"
exit 1
fi
if [ "$static_ip" == "" ];then #如果没有预设固定IP,就设置自动获取IP
#先停止dhclient进程
pkill -f "dhclient $1" >/dev/null 2>&1
#执行dhclient获取IP
dhclient $1 >/dev/null 2>&1
sleep 1
#检查网卡的IP
check_ip $1
else
if [ "$static_ip" != "" -a "$netmask" != "" -a "$gateway" != "" -a "$dns_server" != "" ];then
#设置静态IP
nmcli con mod $1 ipv4.addresses $static_ip/$netmask ipv4.method manual >> /dev/null 2>&1
#设置网关
nmcli con mod $1 ipv4.gateway $gateway >> /dev/null 2>&1
#设置DNS
nmcli con mod $1 ipv4.dns "$dns_server" >> /dev/null 2>&1
#重启网卡生效
nmcli con up $1 >> /dev/null 2>&1
sleep 1
#检查网卡的IP
check_ip $1
else #如果预设的参数有缺失
if [ "$netmask" != "" ];then
red "未设置子网掩码\n"
fi
if [ "$gateway" != "" ];then
red "未设置网关IP\n"
fi
if [ "$dns_server" != "" ];then
red "未设置DNS服务器\n"
fi
red "固定IP预设参数不全,改成自动获取IP\n"
#先停止dhclient进程
pkill -f "dhclient $1" >/dev/null 2>&1
#执行dhclient获取IP
dhclient $1 >/dev/null 2>&1
sleep 1
#检查网卡的IP
check_ip $1
fi
fi
}
#获取物理网卡名称
function check_phy_nic(){
if [ -z $phy_nic ];then #如果没有预设物理网卡名称,就自动检测
phy_nic=$(ls /sys/class/net/ | xargs -I {} sh -c 'if [ -d /sys/class/net/{}/device ]; then echo {}; fi' | grep -E 'enp|ens|eth' | head -1)
fi
if [ -z "$phy_nic" ]; then #如果没有获取到物理网卡名称
yellow "物理网卡名称: "; red "未检测到物理网卡\n"
check_phy_nic_name_result="未检测到物理网卡"
else
yellow "物理网卡名称: "; green "$phy_nic\n"
check_phy_nic_name_result="物理网卡名称$phy_nic"
check_phy_nic_brand_result=$(lspci | grep -i ethernet | awk -F ':' '{print $3}' | awk '{print $1}')
check_phy_nic_model_result=$(dmesg | grep -i $phy_nic | head -n 1 | awk '{print $3}')
yellow "物理网卡品牌: "; green "$check_phy_nic_brand_result\n"
yellow "物理网卡型号: "; green "$check_phy_nic_model_result\n"
fi
}
#ovs网卡设置程序
#用法:configure_ovs check|setup|restore 物理网卡名
function configure_ovs(){
if [ -z $1 ];then
red "没有输入物理网卡名\n"
exit 1
fi
if [ "$1" == "check" -o "$1" == "check-csv" ];then
#检查物理网卡的状态
if ip ad show "$2" | grep UP &>/dev/null; then
check_phy_nic_status_result="物理网卡${2}状态是UP"
yellow "物理网卡状态: "; green "UP\n"
else
check_phy_nic_status_result="物理网卡${2}状态是DOWN"
yellow "物理网卡状态: "; red " DOWN\n"
fi
#检查物理网卡的IP
check_ip $2
if [ $? -eq 0 ]; then
yellow "物理网卡的IP: "; red "$ip_addr\n"
check_phy_nic_ip_result="物理网卡的IP是$ip_addr"
else
yellow "物理网卡的IP: "; green "未设置\n"
check_phy_nic_ip_result="物理网卡的IP未设置"
fi
#判断物理网卡对应的OVS网卡是否存在(默认命名规则:物理网卡名-ovs)
ovs_nic="$2-ovs"
if ip ad show "$ovs_nic" &>/dev/null; then
yellow "对应的OVS网卡: "; blue "$ovs_nic"; green " 存在\n"
#检查物理网卡的OVS桥接设置
if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
check_ovs_nic_result="物理网卡${2}的OVS桥接设置正常"
yellow "OVS桥接设置: "; green "正常\n"
else
check_ovs_nic_result="物理网卡${2}的OVS桥接设置异常"
yellow "OVS桥接设置: "; red "异常\n"
fi
#检测ovs网卡的IP
check_ip $ovs_nic
if [ $? -eq 0 ]; then
yellow "OVS网卡的IP: "; green "$ip_addr\n"
check_ovs_nic_ip_result="OVS网卡的IP是$ip_addr"
else
yellow "OVS网卡的IP: "; red "未设置\n"
check_ovs_nic_ip_result="OVS网卡的IP未设置"
fi
else
yellow "对应的OVS网卡: "; blue "$ovs_nic"; red " 不存在\n"
check_ovs_nic_result="对应的OVS网卡${ovs_nic}不存在"
fi
elif [ "$1" == "setup" -o "$1" == "setup-csv" ];then
#检查物理网卡的UP状态
if ip ad show "$2" | grep UP &>/dev/null; then
check_phy_nic_status_result="物理网卡${2}状态是UP"
yellow "物理网卡状态: "; green "UP\n"
else
#把物理网卡设置为UP状态
ifup $2
if ip ad show "$2" | grep UP; then
check_phy_nic_status_result="物理网卡${2}状态设置为UP成功"
yellow "物理网卡状态: "; green "UP\n"
else
check_phy_nic_status_result="物理网卡${2}状态是DOWN"
yellow "物理网卡状态: "; red "DOWN\n"
fi
fi
#检查物理网卡的IP
check_ip $2
if [ $? -eq 0 ];then #如果物理网卡配了IP,就删除其IP配置
ip addr flush dev $2
if [ $? -eq 0 ];then
yellow "删除物理网卡IP: "; green "成功\n"
check_phy_nic_ip_result="删除物理网卡IP成功"
else
yellow "删除物理网卡IP: "; red "失败\n"
check_phy_nic_ip_result="删除物理网卡IP${ip_addr}失败"
fi
else
yellow "物理网卡的IP: "; green "未设置\n"
check_phy_nic_ip_result="物理网卡的IP未设置"
fi
#判断物理网卡对应的OVS网卡是否存在(默认命名规则:物理网卡名-ovs)
ovs_nic="$2-ovs"
if ip ad show "$ovs_nic" &>/dev/null; then
yellow "对应的OVS网卡: "; blue "$ovs_nic"; green " 存在\n"
#检查物理网卡的OVS桥接设置
if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
check_ovs_nic_result="OVS桥接设置正常"
yellow "OVS桥接设置: "; green "正常\n"
else
#把物理网卡从网桥里移除
ovs-vsctl del-port ovs-system $2 >> /dev/null 2>&1
#删掉整个网桥
ovs-vsctl del-br ovs-system >> /dev/null 2>&1
#创建网桥
ovs-vsctl add-br ovs-system >> /dev/null 2>&1
#把物理网卡加入网桥
ovs-vsctl add-port ovs-system $2 >> /dev/null 2>&1
#把OVS网卡设置为UP状态
ifup $ovs_nic
#检测OVS网卡修复结果
if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
check_ovs_nic_result="OVS桥接设置修复成功"
yellow "OVS桥接设置: "; green "修复成功\n"
else
check_ovs_nic_result="OVS桥接修复失败"
yellow "OVS桥接设置: "; red "修复失败\n"
fi
fi
#检测OVS网卡的IP
check_ip $ovs_nic
if [ $? -ne 0 ];then #如果OVS网卡没有设置IP,就进行设置
configure_ip $ovs_nic
if [ $? -eq 0 ];then
yellow "OVS网卡的IP: "; green "$ip_addr\n"
check_ovs_nic_ip_result="OVS网卡的IP是$ip_addr"
else
yellow "OVS网卡的IP: "; red "设置失败\n"
check_ovs_nic_ip_result="OVS网卡的IP设置失败"
fi
else
yellow "OVS网卡的IP: "; green "$ip_addr\n"
check_ovs_nic_ip_result="OVS网卡的IP是$ip_addr"
fi
else
yellow "对应的OVS网卡: "; blue "$ovs_nic"; red " 不存在\n"
#创建网桥
ovs-vsctl add-br $ovs_nic >> /dev/null 2>&1
#把物理网卡加入网桥
ovs-vsctl add-port $ovs_nic $2 >> /dev/null 2>&1
#把OVS网卡设置为UP状态
ifup $ovs_nic >> /dev/null 2>&1
#检测OVS网卡修复结果
if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
check_ovs_nic_result="OVS桥接设置修复成功"
yellow "OVS桥接设置: "; green "修复成功\n"
else
check_ovs_nic_result="OVS桥接修复失败"
yellow "OVS桥接设置: "; red "修复失败\n"
fi
fi
elif [ "$1" == "restore" -o "$1" == "restore-csv" ];then
#判断物理网卡对应的OVS网卡是否存在(默认命名规则:物理网卡名-ovs)
ovs_nic="$2-ovs"
if ip ad show "$ovs_nic" &>/dev/null; then
yellow "对应的OVS网卡: "; blue "$ovs_nic"; red " 存在\n"
#把物理网卡从网桥里移除
ovs-vsctl del-port $ovs_nic $2 >> /dev/null 2>&1
#删除网桥
ovs-vsctl del-br $ovs_nic >> /dev/null 2>&1
#检查OVS网卡删除结果
if ip ad show "$ovs_nic" &>/dev/null; then
yellow "删除OVS网卡"; blue $ovs_nic; yellow ": "; red "失败\n"
check_ovs_nic_result="删除OVS网卡${ovs_nic}失败"
else
yellow "删除OVS网卡"; blue $ovs_nic; yellow ": "; green "成功\n"
check_ovs_nic_result="删除OVS网卡${ovs_nic}成功"
fi
else
yellow "OVS网卡: "; blue "$ovs_nic"; green " 不存在\n"
check_ovs_nic_result="OVS网卡${ovs_nic}不存在"
fi
#检查物理网卡的UP状态
if ip ad show "$2" | grep UP &>/dev/null; then
check_phy_nic_status_result="物理网卡${2}状态是UP"
yellow "物理网卡状态: "; green "UP\n"
else
#把物理网卡设置为UP状态
ifup $2 >> /dev/null 2>&1
if ip ad show "$2" | grep UP &>/dev/null; then
check_phy_nic_status_result="物理网卡${2}状态设置为UP成功"
yellow "物理网卡状态: "; green "UP\n"
else
check_phy_nic_status_result="物理网卡${2}状态是DOWN"
yellow "物理网卡状态: "; red "DOWN\n"
fi
fi
#检查物理网卡的IP
check_ip $2
if [ $? -ne 0 ];then #如果物理网卡没有设置IP,就进行设置
configure_ip $2
if [ $? -eq 0 ];then
yellow "物理网卡的IP: "; green "$ip_addr\n"
check_ovs_nic_ip_result="物理网卡的IP是$ip_addr"
else
yellow "物理网卡的IP: "; red "设置失败\n"
check_ovs_nic_ip_result="物理网卡的IP设置失败"
fi
else
yellow "物理网卡的IP: "; red "$ip_addr\n"
check_phy_nic_ip_result="物理网卡的IP是$ip_addr"
fi
fi
}
#更新脚本文件程序
function upgrade_script_file(){
if [ ! -d "/usr/local/scripts/" ];then #如果不存在/usr/local/scripts/文件夹,就创建该文件夹
mkdir /usr/local/scripts/
fi
if [ "$1" == "check" -o "$1" == "check-csv" ];then
if [ -f "/usr/local/scripts/fix_ovs_network.sh" ];then #如果存在fix_ovs_network.sh脚本
check_upgrade_script_result1="脚本文件fix_ovs_network.sh已部署"
yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
if [ -f "$script_file" ];then #如果存在新上传的脚本
if [ "$(diff /usr/local/scripts/fix_ovs_network.sh $script_file)" == "" ];then #如果旧脚本和新脚本完全相同
check_upgrade_script_result2="脚本文件无需更新"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
else
check_upgrade_script_result2="脚本文件需要更新"
yellow "脚本更新: "; red "$check_upgrade_script_result2\n"
fi
else
check_upgrade_script_result2="脚本文件无需更新"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
fi
#检测fix_ovs_network.sh的权限
if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" == "" ];then #如果fix_ovs_network.sh脚本的权限不是700
check_upgrade_script_result3="脚本权限不是700"
yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
else #如果fix_ovs_network.sh脚本的权限是700
check_upgrade_script_result3="脚本权限是700"
yellow "脚本权限: "; green "$check_upgrade_script_result3\n"
fi
else
check_upgrade_script_result1="脚本文件fix_ovs_network.sh未部署"
check_upgrade_script_result2="脚本文件无需更新"
check_upgrade_script_result3="脚本权限无法检测"
yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
fi
check_upgrade_script_result="$check_upgrade_script_result1;$check_upgrade_script_result2;$check_upgrade_script_result3"
elif [ "$1" == "setup" -o "$1" == "setup-csv" ];then
if [ -f "/usr/local/scripts/fix_ovs_network.sh" ];then #如果存在fix_ovs_network.sh脚本
check_upgrade_script_result1="脚本文件fix_ovs_network.sh此前已部署"
yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
if [ -f "$script_file" ];then #如果存在新上传的tempcmd-root-fix_ovs_network.sh脚本
if [ "$(diff /usr/local/scripts/fix_ovs_network.sh $script_file)" == "" ];then #如果旧脚本和新脚本完全相同
check_upgrade_script_result2="脚本文件无需更新"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
else
cp -f $script_file /usr/local/scripts/fix_ovs_network.sh
if [ $? -eq 0 ];then
check_upgrade_script_result2="脚本文件更新成功"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
else
check_upgrade_script_result2="脚本文件更新失败"
yellow "脚本更新: "; red "$check_upgrade_script_result2\n"
fi
fi
else
check_upgrade_script_result2="脚本文件无需更新"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
fi
#检测fix_ovs_network.sh的权限
if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" == "" ];then #如果fix_ovs_network.sh脚本的权限不是700
chmod 700 /usr/local/scripts/fix_ovs_network.sh
if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" != "" ];then
check_upgrade_script_result3="脚本权限设置为700成功"
yellow "脚本权限: "; green "$check_upgrade_script_result3\n"
else
check_upgrade_script_result3="脚本权限设置为700失败"
yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
fi
else #如果fix_ovs_network.sh脚本的权限是700
check_upgrade_script_result3="脚本权限已经是700"
yellow "脚本权限: "; green "$check_upgrade_script_result3\n"
fi
else
if [ -f "$script_file" ];then #如果存在新上传的tempcmd-root-fix_ovs_network.sh脚本
cp -f $script_file /usr/local/scripts/fix_ovs_network.sh
if [ $? -eq 0 ];then
check_upgrade_script_result1="脚本文件fix_ovs_network.sh部署成功"
check_upgrade_script_result2="脚本文件无需更新"
yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" == "" ];then #如果fix_ovs_network.sh脚本的权限不是700
chmod 700 /usr/local/scripts/fix_ovs_network.sh
if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" != "" ];then
check_upgrade_script_result3="脚本权限设置为700成功"
yellow "Script Permissions: "; green "$check_upgrade_script_result3\n"
else
check_upgrade_script_result3="脚本权限设置为700失败"
yellow "Script Permissions: "; red "$check_upgrade_script_result3\n"
fi
else #如果fix_ovs_network.sh脚本的权限是700
check_upgrade_script_result3="脚本权限已经是700"
yellow "Script Permissions: "; green "$check_upgrade_script_result3\n"
fi
else
check_upgrade_script_result1="脚本文件fix_ovs_network.sh部署失败"
check_upgrade_script_result2="脚本文件无需更新"
check_upgrade_script_result3="脚本权限无法检测"
yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
fi
else
check_upgrade_script_result1="脚本文件fix_ovs_network.sh未部署"
check_upgrade_script_result2="脚本文件无需更新"
check_upgrade_script_result3="脚本权限无法检测"
yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
fi
fi
check_upgrade_script_result="$check_upgrade_script_result1;$check_upgrade_script_result2;$check_upgrade_script_result3"
elif [ "$1" == "restore" -o "$1" == "restore-csv" ];then
if [ -f "/usr/local/scripts/fix_ovs_network.sh" ];then #如果存在fix_ovs_network.sh脚本
rm -f /usr/local/scripts/fix_ovs_network.sh
if [ ! -f "/usr/local/scripts/fix_ovs_network.sh" ];then
check_upgrade_script_result1="脚本文件fix_ovs_network.sh删除成功"
yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
else
check_upgrade_script_result1="脚本文件fix_ovs_network.sh删除失败"
yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
fi
else
check_upgrade_script_result1="脚本文件fix_ovs_network.sh此前已删除"
yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
fi
check_upgrade_script_result="$check_upgrade_script_result1"
fi
}
#设置任务计划程序
function config_crontab(){
if [ "$1" == "check" -o "$1" == "check-csv" ];then
root_cron_file="/var/spool/cron/crontabs/root"
if [ -f "$root_cron_file" ];then #如果存在root的任务文件
if [ "$(cat $root_cron_file | grep 'fix_ovs_network.sh')" != "" ];then #如果已经存在'fix_ovs_network.sh任务,判断设置的模式
#检测是否存在重启后设置任务
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result1="重启后设置任务已添加"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
else
check_crontab_result1="重启后设置任务已添加但存在重复任务"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
fi
else
check_crontab_result1="重启后设置任务未添加"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
fi
#检测是否存在每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result2="每分钟设置任务已添加"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
else
check_crontab_result2="每分钟设置任务已添加但存在重复任务"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
else
check_crontab_result2="每分钟设置任务未添加"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
else
check_crontab_result1="重启后设置任务未添加"
check_crontab_result2="每分钟设置任务未添加"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
else
check_crontab_result1="重启后设置任务未添加"
check_crontab_result2="每分钟设置任务未添加"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
check_crontab_result="$check_crontab_result1;$check_crontab_result2"
elif [ "$1" == "setup" -o "$1" == "setup-csv" ];then
root_cron_file="/var/spool/cron/crontabs/root"
if [ -f "$root_cron_file" ];then #如果存在root的任务文件
#检测是否存在重启恢复任务
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result1="重启后设置任务此前已添加"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
else
#如果该任务重复配置,就删除全部该任务,然后重新添加一次
sed -i "/@reboot sleep 5 && source \/etc\/profile && sh \/usr\/local\/scripts\/fix_ovs_network.sh/d" $root_cron_file
echo "@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result1="重启后设置任务此前已添加"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
else
check_crontab_result1="重启后设置任务此前已添加但存在重复任务"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
fi
fi
else
#echo "@reboot /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加重启设置任务
echo "@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加重启设置任务
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
check_crontab_result1="重启后设置任务添加成功"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
else
check_crontab_result1="重启后设置任务添加失败"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
fi
fi
#检测是否存在每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result2="每分钟设置任务此前已添加"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
else
#如果该任务重复配置,就删除全部该任务,然后重新添加一次
sed -i "/\* \* \* \* \* \/bin\/sh \/usr\/local\/scripts\/fix_ovs_network.sh/d" $root_cron_file
echo "* * * * * /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result2="重启后设置任务此前已添加"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
else
check_crontab_result2="每分钟设置任务此前已添加但存在重复任务"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
fi
else
echo "* * * * * /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
check_crontab_result2="每分钟设置任务添加成功"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
else
check_crontab_result2="每分钟设置任务添加失败"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
fi
else
#添加重启恢复任务
echo "@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加重启设置任务
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
check_crontab_result1="重启后设置任务添加成功"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
else
check_crontab_result1="重启后设置任务添加失败"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
fi
#添加每分钟设置任务
echo "* * * * * /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
check_crontab_result2="每分钟设置任务添加成功"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
else
check_crontab_result2="每分钟设置任务添加失败"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
fi
check_crontab_result="$check_crontab_result1;$check_crontab_result2"
/sbin/service cron restart >> /dev/null 2>&1 #重启cron服务
elif [ "$1" == "restore" -o "$1" == "restore-csv" ];then
root_cron_file="/var/spool/cron/crontabs/root"
if [ -f "$root_cron_file" ];then #如果存在root的任务文件
if [ "$(cat $root_cron_file | grep 'fix_ovs_network.sh')" != "" ];then #如果已经存在fix_ovs_network.sh任务
#删除所有fix_ovs_network.sh任务
sed -i "/fix_ovs_network.sh/d" $root_cron_file
#检查Iptables重启恢复任务是否删除
if [ "$(cat $root_cron_file | grep '^@reboot*.*fix_ovs_network.sh')" == "" ];then
check_crontab_result1="重启后设置任务删除成功"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
else
check_crontab_result1="重启后设置任务删除失败"
yellow "重启后设置任务: "; red "$check_crontab_result1\n"
fi
#检查每分钟设置任务是否删除
if [ "$(cat $root_cron_file | grep '^*[[:space:]]*.*fix_ovs_network.sh')" == "" ];then
check_crontab_result2="每分钟设置任务删除成功"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
else
check_crontab_result2="每分钟设置任务删除失败"
yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
fi
else
check_crontab_result1="重启后设置任务不存在"
check_crontab_result2="每分钟设置任务不存在"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
fi
else
check_crontab_result1="重启后设置任务不存在"
check_crontab_result2="每分钟设置任务不存在"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
fi
check_crontab_result="$check_crontab_result1;$check_crontab_result2"
/sbin/service cron restart >> /dev/null 2>&1 #重启cron服务
fi
}
#CSV格式结果显示程序
function show_csv_result(){
check_ovs_result="$ipaddr,$system_name,$system_version,$check_phy_nic_name_result,$check_phy_nic_brand_result,$check_phy_nic_model_result,$check_phy_nic_status_result,$check_phy_nic_ip_result,$check_ovs_nic_result,$check_ovs_nic_ip_result,$check_upgrade_script_result,$check_crontab_result"
echo check_ovs_result="$check_ovs_result"
}
#主程序
function main(){
if [ "$1" == "check" -o "$1" == "setup" -o "$1" == "restore" ];then
blue "飞牛OS有线OVS网卡IP丢失自动修复脚本 $version\n"
echo
#操作系统名称检测
system_check
#获取物理网卡名称
check_phy_nic
#ovs网卡设置程序
configure_ovs $1 $phy_nic
#更新脚本文件程序
upgrade_script_file $1
#设置任务计划程序
config_crontab $1
elif [ "$1" == "check-csv" -o "$1" == "setup-csv" -o "$1" == "restore-csv" ];then
#服务器ip地址获取程序
get_ip >> /dev/null 2>&1
#操作系统名称检测
system_check >> /dev/null 2>&1
#获取物理网卡名称
check_phy_nic >> /dev/null 2>&1
#ovs网卡设置程序
configure_ovs $1 $phy_nic >> /dev/null 2>&1
#更新脚本文件程序
upgrade_script_file $1 >> /dev/null 2>&1
#设置任务计划程序
config_crontab $1 >> /dev/null 2>&1
#CSV格式结果显示程序
show_csv_result
fi
}
#帮助程序
function help(){
green "用法: "; yellow "$0 ( check | check-csv | setup | setup-csv | restore | restore-csv )\n"
green "举例:\n"
yellow "$0 check ";green "#检查OVS网卡,检查IP设置,检查定时任务\n"
yellow "$0 check-csv ";green "#检查OVS网卡,检查IP设置,检查定时任务,显示CSV格式信息\n"
yellow "$0 setup ";green "#修复OVS网卡,设置IP到OVS网卡,添加定时任务\n"
yellow "$0 setup-csv ";green "#修复OVS网卡,设置IP到OVS网卡,添加定时任务,显示CSV格式信息\n"
yellow "$0 restore ";green "#删除OVS网卡,设置IP到物理网卡,删除定时任务\n"
yellow "$0 restore-csv ";green "#删除OVS网卡,设置IP到物理网卡,删除定时任务,显示CSV格式信息\n"
echo
exit
}
#必须由root启动
if [ $UID -ne 0 ];then
red "请使用root用户运行此脚本!\n"
echo check_ovs_result="请使用root用户运行此脚本"
exit
fi
#检查输入的参数
if [ $# -ne 1 ];then
red "脚本必须输入1个参数\n"
echo
help
exit
elif [ "$1" == "check" -o "$1" == "check-csv" -o "$1" == "setup" -o "$1" == "setup-csv" -o "$1" == "restore" -o "$1" == "restore-csv" ];then
main $1
else
red "输入的参数错误"
help
exit
fi
使用说明:
1、把脚本文件上传到/tmp/文件夹
2、切换到root用户
3、给脚本添加执行权限
cd /tmp
chmod +x fix_ovs_network_v1.1.sh
4、查看程序帮助菜单,输入执行参数。
./fix_ovs_network_v1.1.sh #回车可查看帮助菜单

5、使用check和check-csv参数,可以检测当前的OVS网卡的IP设置和任务设置
./fix_ovs_network_v1.1.sh check


6、使用setup和setup-csv参数,可以修复OVS网卡,设置IP到OVS网卡,添加定时任务,如果检测没问题就不做任何修复操作。

7、使用restore和restore-csv参数,可以删除OVS网卡,设置IP到物理网卡,删除定时任务。

8、使用注意:在删除OVS网卡后,会导致虚拟机无法使用。如果使用setup参数再次设置OVS网卡后,最好重启下飞牛主机。
9、脚本可以自动检测物理网卡,但编写没有考虑存在多个物理网卡的情况,也没考虑使用无线网卡的情况,也没考虑使用多网卡聚合的情况,如果这种情况下也想使用脚本,可以在脚本里指定物理网卡名称,不过我没做测试。
10、脚本默认是给OVS网卡自动获取IP,如果想配置固定IP,可以在脚本里预设固定IP、掩码、网关和DNS服务器,缺了任何一项都会改成自动获取IP。
附件:fix_ovs_network_v1.1.zip