使用发现之前V1.2版里设置固定IP时,掩码的变量写错了,导致设置固定IP功能无效。另外还发现如果是用直接修改/etc/network/interfaces文件配置的方式去设置固定IP,会被飞牛OS把IP清了。但使用ip add 命令加的IP可以长久生效。
#!/bin/bash
#飞牛OS有线OVS网卡IP丢失自动修复脚本
#V1.3更新
#1、修改设置固定ip的方法,修改了预设掩码时的错误变量名
#2、DNS服务器默认使用8.8.8.8
#3、改为自动获取脚本文件名,避免手工修改文件名导致MD5校验失效
#V1.2更新
#1、增加检测网络是否通畅的功能,判断能否ping通网关,能否ping通外网
#2、增加OVS网卡有IP,但判断网络不通后,自动删除IP重置的功能
#3、修复任务计划里的bug,把/bin/sh换成/bin/bash --20260326
#V1.1功能:
#1、检测到OVS网卡丢失时自动创建OVS网卡
#2、检测到OVS网卡无IP时自动执行dhclient获取IP,如果指定了IP就设置固定IP到OVS网卡
######全局变量######
version="v1.3" #脚本版本号
script_file="$(echo $0 | awk -F '/' '{print $2}')" #自动获取脚本文件名
phy_nic="" #物理网卡:如果预设了名称,不自动检测物理网卡名
ovs_nic="" #OVS网卡
ip_addr="" #自动检测到的IP
static_ip="" #固定IP:如果留空就默认自动获取IP
netmask="24" #子网掩码:如果设置了固定IP,务必要填写子网掩码
gateway="" #网关IP:如果设置了固定IP,务必要填写网关IP
dns_server="8.8.8.8" #DNS服务器:如果设置了固定IP,务必要填写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
#删除指定网卡的IP
ip addr flush dev $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
#禁用飞牛OS网络托管
systemctl stop systemd-networkd >> /dev/null 2>&1
systemctl disable systemd-networkd >> /dev/null 2>&1
#删除指定网卡的IP
ip addr flush dev $1 >/dev/null 2>&1
#设置静态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
#设置静态IP
ip addr add $static_ip/$netmask dev $1 >> /dev/null 2>&1
#设置网卡up
ip link set $1 up >> /dev/null 2>&1
#设置网关
ip route replace default via $gateway >> /dev/null 2>&1
#设置DNS
if [ "$(cat /etc/resolv.conf | grep "^nameserver $dns_server")" == "" ];then
echo "nameserver $dns_server" >> /etc/resolv.conf >> /dev/null 2>&1
fi
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
#删除指定网卡的IP
ip addr flush dev $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 {} /bin/bash -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
}
#ping测试程序
function ping_test(){
#对每个ip各ping三次判断存活状态,如ping失败3次,就显示“ping测试失败”
ping -c1 -W1 $1 >> /dev/null 2>&1 #ping该IP第1次,判断ping的结果, -c1 表示只ping一次,-W1表示超时等待时间是1秒
if [ $? -eq 0 ];then #如果第1次ping通了,就return 0,后面就不用再ping了
return 0
else #如果第1次没ping通,就ping第2次
ping -c1 -W1 $1 >> /dev/null 2>&1 #ping该IP第1次,判断ping的结果, -c 1 表示只ping一次,-i 0.2表示ping的间隔是0.2秒, -W 0.2表示超时等待时间是0.2秒
if [ $? -eq 0 ];then #如果第2次ping通了,就return 0,后面就不用再ping了
return 0
else #如果第2次没ping通,就ping第3次
ping -c1 -W1 $1 >> /dev/null 2>&1 #ping该IP第1次,判断ping的结果, -c 1 表示只ping一次,-i 0.2表示ping的间隔是0.2秒, -W 0.2表示超时等待时间是0.2秒
if [ $? -eq 0 ];then #如果第3次ping通了,就return 0,后面就不用再ping了
return 0
else #如果第3次没ping通,就return 1
return 1
fi
fi
fi
}
#测试网关的连通性
function ping_test_gateway(){
test_gateway="$(ip route | grep default | awk '{print $3}')"
#测试网关是否可达
if [ ! -z $test_gateway ];then
ping_test $test_gateway
if [ $? -eq 0 ];then
yellow "Ping测试网关: "; blue "${test_gateway}"; green " 成功\n";
ping_test_gateway_resdult="Ping测试网关${test_gateway}成功"
return 0
else
yellow "Ping测试网关: "; blue "${test_gateway}"; red " 失败\n";
ping_test_gateway_resdult="Ping测试网关${test_gateway}失败"
return 1
fi
else
yellow "Ping测试网关: "; red "未获取到网关IP\n";
ping_test_gateway_resdult="Ping测试网关未获取到网关IP"
return 1
fi
}
#测试外网 域名的连通性
function ping_test_internet(){
test_dns="$(nslookup www.baidu.com | grep '^Server:' | awk '{print $2}')"
test_domain="www.baidu.com"
#测试外网 域名是否可达
if [ ! -z $test_dns ];then
ping_test "www.baidu.com"
if [ $? -eq 0 ];then
yellow "Ping测试域名: "; blue "${test_domain}"; green " 成功\n";
ping_test_domain_result="Ping测试域名${test_domain}成功"
return 0
else
yellow "Ping测试域名: "; blue "${test_domain}"; red " 失败\n";
ping_test_domain_result="Ping测试域名${test_domain}失败"
return 1
fi
else
yellow "Ping测试域名: "; red "未设置DNS服务器\n";
ping_test_domain_result="Ping测试域名未设置DNS服务器"
return 1
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"
#测试网关的连通性
ping_test_gateway
#测试外网 域名的连通性
ping_test_internet
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-port $ovs_nic $2 >> /dev/null 2>&1
ovs-vsctl del-port $2 >> /dev/null 2>&1
#删掉整个网桥
#ovs-vsctl del-br ovs-system >> /dev/null 2>&1
ovs-vsctl del-br $ovs_nic >> /dev/null 2>&1
#创建网桥
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
ip link set dev $ovs_nic up
#检测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"
#测试网关的连通性
ping_test_gateway
#测试外网 域名的连通性
ping_test_internet
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"
#测试网关的连通性
ping_test_gateway
if [ $? -eq 1 ];then
red "检测到网关IP无法ping通,强制重置网卡${ovs_nic}的IP\n"
configure_ip $ovs_nic #如果OVS网卡有IP,但ping不通网关,说明可能是虚假设置,就强制删除IP重新获取
if [ $? -eq 0 ];then
yellow "OVS网卡重置后的IP: "; green "$ip_addr\n"
check_ovs_nic_ip_result="OVS网卡重置后的IP是$ip_addr"
#测试网关的连通性
ping_test_gateway
#测试外网 域名的连通性
ping_test_internet
else
yellow "OVS网卡的IP: "; red "强制重置失败\n"
check_ovs_nic_ip_result="OVS网卡的IP强制重置失败"
fi
else #如果能ping通网关,就测试能否ping通外网 域名
#测试外网 域名的连通性
ping_test_internet
fi
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
#检测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"
#测试网关的连通性
ping_test_gateway
#测试外网 域名的连通性
ping_test_internet
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"
#测试网关的连通性
ping_test_gateway
#测试外网 域名的连通性
ping_test_internet
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"
#测试网关的连通性
ping_test_gateway
#测试外网 域名的连通性
ping_test_internet
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"
#测试网关的连通性
ping_test_gateway
#测试外网 域名的连通性
ping_test_internet
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 && /bin/bash /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^@reboot*.*/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/bash /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* *.*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 && /bin/bash /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^@reboot*.*fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result1="重启后设置任务此前已添加"
yellow "重启后设置任务: "; green "$check_crontab_result1\n"
else
#如果该任务重复配置,就删除全部该任务,然后重新添加一次
sed -i "/@reboot*.*fix_ovs_network.sh/d" $root_cron_file
echo "@reboot sleep 5 && source /etc/profile && /bin/bash /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && /bin/bash /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 sleep 5 && source /etc/profile && /bin/bash /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加重启设置任务
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && /bin/bash /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/bash /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* *.*/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
check_crontab_result2="每分钟设置任务此前已添加"
yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
else
#如果该任务重复配置,就删除全部该任务,然后重新添加一次
sed -i "/\* \* \* \* \* *.*fix_ovs_network.sh/d" $root_cron_file
echo "* * * * * /bin/bash /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/bash /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/bash /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/bash /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 && /bin/bash /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加重启设置任务
if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && /bin/bash /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/bash /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file #添加每分钟设置任务
if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/bash /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,$ping_test_gateway_result,$ping_test_domain_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
附件:fix_ovs_network_v1.3.zip