一、运行环境

软路由上跑了 esxi 6.7,esxi 上运行了 openwrt 虚拟机作为主路由,UPS 给软路由供电

实现功能

1.停电后UPS供电期间esxi自动关机

ping内网市电供电的设备,判断当前市电是否正常,如果超过指定次数,都不能ping通,则说明市电故障,关机,从而实现停电自动关机

2.网络故障自动恢复

ping 外网IP,超过指定次数不能ping通,则重启openwrt虚拟机,如果连续重启了指定次数网络还不能恢复正常,则重启软路由

二、整体文件结构


config.ini 配置文件
log.txt 日志文件,由程序生成
power_and_network.py 脚本文件

三、python 脚本

文件路径:
/vmfs/volumes/datastore1/python_scripts/power_and_network/power_and_network.py

坑坑:注意赋予文件执行权限!!!

#!/bin/python3
# -*- coding: utf-8 -*-import os, sys
import time
import subprocess
import logging
import configparserconfig = {}def process_detect():'''检测当前是否已经有在运行该程序,有则退出'''status, output = subprocess.getstatusoutput("ps -c | grep %s | grep -v grep | wc -l" % os.path.basename(__file__))print("Number of processes: %s" % output)process_sum = int(output)if process_sum > 1:print("Process already running, exit!");sys.exit()else:logging.info("Start ===== ")def ping(addr):'''ping 指定ip,网络正常返回 True'''ret = os.system("ping -c 1 -W 1 %s > /dev/null" % addr)if ret == 0:return Trueelse:return Falsedef power_220v_is_ok():'''ping 指定ip,判断220v市电是否正常'''if ping(config['220v_ip1']) or ping(config['220v_ip2']):return Trueelse:return Falsedef network_is_ok():'''ping 指定外网IP 判断网络是否正常'''if ping(config['network_ip1']) or ping(config['network_ip2']):return Trueelse:return Falsedef openwrt_reset():'''重启 openwrt'''logging.info("openwrt_reset!")os.system(config['openwrt_off'])time.sleep(2)os.system(config['openwrt_on'])time.sleep(config['openwrt_wait'])def log_config():'''日志配置'''logging.basicConfig(filename=os.path.dirname(os.path.realpath(__file__)) + '/log.txt', level=logging.DEBUG, format="%(asctime)s %(message)s", datefmt="%Y/%m/%d %H:%M:%S -> ")# logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S ->")def readConf():'''读取配置文件'''conf = configparser.ConfigParser()file_path = os.path.dirname(os.path.realpath(__file__)) + '/config.ini'     # 配置文件绝对路径print(file_path)conf.read(file_path, encoding = "utf-8")  config['220v_ip1'] = conf.get("power_220v", "ip1") config['220v_ip2'] = conf.get("power_220v", "ip2") config['220v_ping_sum'] = int(conf.get("power_220v", "ping_sum"))config['network_ip1'] = conf.get("network", "ip1") config['network_ip2'] = conf.get("network", "ip2") config['network_ping_sum'] = int(conf.get("network", "ping_sum"))config['network_reset_esxi'] = int(conf.get("network", "reset_esxi"))config['openwrt_off'] = conf.get("openwrt", "off_cmd") config['openwrt_on'] = conf.get("openwrt", "on_cmd") config['openwrt_wait'] = int(conf.get("openwrt", "wait"))config['sleep_sec'] = int(conf.get("default", "sleep_sec"))print("===== Configuration =====")print(config)print("====================")def main():log_config()readConf()process_detect()power_220v_cnt = 0openwrt_cnt = 0openwrt_reset_wan_cnt = 0while True:sleep_sec = config['sleep_sec']if power_220v_is_ok():print("Power 220V ok!")power_220v_cnt = 0else:sleep_sec -= 4power_220v_cnt += 1logging.info("[%d/%d] 220V Power maybe off,checking again after %d seconds!" % (power_220v_cnt, config['220v_ping_sum'], config['sleep_sec']))if power_220v_cnt >= config['220v_ping_sum']:logging.info("Poweroff!")os.system("poweroff")while True:                    time.sleep(1)if network_is_ok():print("Network ok!")openwrt_cnt = 0openwrt_reset_wan_cnt = 0else:sleep_sec -= 4openwrt_cnt += 1logging.info("[%d/%d] Network maybe disconnected!(reboot %d/%d)" % (openwrt_cnt, config['network_ping_sum'], openwrt_reset_wan_cnt, config['network_reset_esxi']))if openwrt_cnt >= config['network_ping_sum']:openwrt_cnt = 0openwrt_reset_wan_cnt += 1if openwrt_reset_wan_cnt >= config['network_reset_esxi']:if power_220v_is_ok():              #市电正常时才进行重启,否则配置的市电故障关机时间比重启时间长的话,会一直重启无法关机logging.info("Reboot!")os.system("reboot")while True:time.sleep(1)openwrt_reset()time.sleep(sleep_sec)if __name__ == '__main__':  main()

四、配置文件

[power_220v]
#两内网IP用于判断市电
ip1 = 192.168.2.2
ip2 = 192.168.2.234#超过该次数,esxi 执行关机, 时间 = ping_sum * sleep_sec + (ping_sum / network_ping_sum) * wait
#公式转为:                 时间 = ping_sum * (sleep_sec + (wait / network_ping_sum))
ping_sum = 40        [network]
#两个外网IP用于判断网络是否正常
ip1 = 114.114.114.114
ip2 = 223.6.6.6#超过该次数,esxi重启openwrt虚拟机,时间 = ping_sum * sleep_sec
ping_sum = 4#连续重启openwrt虚拟机超过该次数,网络还不正常,放大招重启 esxi, 时间 = (ping_sum * sleep_sec + wait) * reset_esxi
#!!!宽带故障的话,软路由会一直重启,时间不要太短
reset_esxi = 30[openwrt]
#外网不正常时,重启openwrt虚拟机
#获取所有虚拟机的vmid命令: vim-cmd vmsvc/getallvms (下边命令后边的数字就是 vmid)
#关闭虚拟机:vim-cmd vmsvc/power.off 3
#打开虚拟机:vim-cmd vmsvc/power.on 3
#重启虚拟机:vim-cmd vmsvc/power.reset 3
#实测执行重启虚拟机命令后,大概30秒恢复网络
#注意:启动命令要加 & 后台运行,不然会阻塞等待启动,导致时间大大延长
off_cmd = vim-cmd vmsvc/power.off 3
on_cmd = vim-cmd vmsvc/power.on 3 &
#执行开机命令后,等待时间
wait = 30[default]
#内部有时间修正,不可以小于8
sleep_sec = 10

IP 跟时间根据自己环境修改
注意用 vim-cmd vmsvc/getallvms 命令获取openwrt 虚拟机 id 进行修改

五、日志文件

日志格式如下

2021/05/23 22:01:54 ->  Start =====
2021/05/23 22:01:58 ->  [1/40] 220V Power maybe off,checking again after 10 seconds!
2021/05/23 22:02:02 ->  [1/4] Network maybe disconnected!(reboot 0/30)
2021/05/23 22:02:08 ->  [2/4] Network maybe disconnected!(reboot 0/30)
2021/05/23 22:02:18 ->  [3/4] Network maybe disconnected!(reboot 0/30)
2021/05/23 22:02:28 ->  [4/4] Network maybe disconnected!(reboot 0/30)
2021/05/23 22:02:28 ->  openwrt_reset!

六、设置计划任务定时启动脚本

利用cron设置计划任务
vi /etc/rc.local.d/local.sh 修改文件,在文件末尾的 exit 0 前面添加上我们需要的命令:

/bin/kill $(cat /var/run/crond.pid)
/bin/echo "*/1   *    *   *   *  /vmfs/volumes/datastore1/python_scripts/power_and_network/power_and_network.py > /dev/null &" >> /var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond

含义:
第一行:cat /var/run/crond.pid,该命令会显示出crond该命令的进程号,然后调用kill命令将crond进程kill掉
第二行:使用echo命令在 /var/spool/cron/crontabs/root 文件中追加我们要设置的计划任务的命令,"*/1 * * * * xxxxxx" 意思是每1分钟,执行一次 xxxxxx

坑坑:注意这里要加上 > /dev/null & 让脚本后台运行!!!!

第三行:重启crond进程

最后执行 /sbin/auto-backup.sh 脚本,local.sh文件才会正真地保存,否则会可能重启后就会被还原。

七、大坑

crond 计划任务执行python脚本,编码会变成 ascii ,print输出中文就会报错,导致脚本运行失败,在命令行里边手动运行脚本是正常的,至今原因未知,目前解决办法是把所有中文输出都改为英文,有大佬知道原因的话,希望能在评论区告知一下,谢谢!

【软路由】esxi 配合UPS停电自动关机,网络异常自动重启openwrt虚拟机相关推荐

  1. 服务器虚拟机装软路由,Esxi虚拟机安装Ros+Openwrt软路由双系统简单分享(踩到的坑,很大的坑)...

    近段时间ke学上网反应很慢,网上看到了 Ros+Openwr能够解决DNS污染的这个问题,所以看看自己的3825U小主机刚可以满足要求,搞一下吧. 听说L大的openwrt软路由固件ke学上网很不错, ...

  2. 【LEDE】x86软路由之路-12-浅谈复杂网络环境中的AP优化

    很多时候家里人总是抱怨咱家的网怎么那么慢?唱全民K歌别人家的页面刷的一下就打开了,这边还正在加载呢,别人上传作品嗖嗖的,自己就等着进度条一点一点走.总是嚷嚷着移动的网不好,人家联通的网就很好. 到最后 ...

  3. Windows网络无连接自动重启bat脚本

    脚本文件 auto_reboot.bat @echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" " ...

  4. 史上最简单的虚拟机搭建软路由+ NAS+家庭媒体中心的白皮书

    原文网址:https://post.smzdm.com/p/a5k6ml3k/ 前言: 引言: 上次写的那篇一步一步搭建高配置软路由发出来以后,得到了很多值友的赞赏,也有很多的值友希望能有更进一步的文 ...

  5. 史上最简单的虚拟机搭建软路由 NAS 家庭媒体中心

    前言: 虚拟机环境搭建: 虚拟机选择:虚拟机的选择有很多:Hyper-V.VMware.Exsi.virualbox,稳定性最高,兼容性最好,资源消耗也最小的应该是Hyper-V和Exsi,我自己用的 ...

  6. 工作室软路由该用哪个系统?

    大家好,有很多客户在起步阶段不知道该选择什么系统的软路由,呢么我今天简单说一下工作室网络搭建中软路由系统选择的问题. 随着抖音.快手以及各种平台的风控标准越来越高,对于网络的要求也越来越高,那么抖音. ...

  7. win10 软路由_从听说到上手,人人都能看懂的软路由入门指南

    天跟大家分享一篇关于软路由的文章,全程内容比较硬核,希望各位爱折腾的玩家们千万不要错过哦!! 作者:Brick713      文章转载自少数派在互联网时代,家庭网络带宽速度飞速地提升,家庭中的智能移 ...

  8. Proxmox VE(PVE)、软路由、黑群晖(NAS)成功之道

    为什么要安装黑群晖(NAS)? 随着网络的发展,数据量也不断增大,家庭NAS会是生活中必不可少的一部分. 360云盘事件,告诉我们网络云盘的不安全性. 白群晖价格昂贵,而且安装黑群晖更加灵活,可以安装 ...

  9. 软路由的正确组网姿势(下篇)

    挨踢魔君在<软路由的正确组网姿势(上篇)>中已经详细介绍了软路由做主路由的组网方案,本篇(下篇)接着聊一下软路由做旁路由的组网方案,并对二者进行简单的总结.主路由组网结构简单清晰,容易理解 ...

最新文章

  1. 世界各国钱币(ZT)
  2. Office 办公软件的问题解决方案
  3. 平面分割 题解(1.16 递推模拟)
  4. MachineLearning(11)-关联规则分析
  5. 如何修改matlab中的语句,求大神帮忙看一下这个语句怎么改!!!!!
  6. 宝塔面板ab模板建站_使用宝塔面板创建网站,安装网站程序,wordpress建站
  7. field list什么意思_时序数据库有什么不一样?
  8. 随着浏览器窗口缩小表格出现横向滚动条
  9. 50 years, 50 colors HDU - 1498(最小点覆盖或者说最小顶点匹配)
  10. openssl生成key和pem文件
  11. 流量星球:实操!利用“拼多多砍价群”日吸100+精准女粉引流技术
  12. Excel·VBA考勤打卡记录统计出勤小时
  13. Hyperledger Fabric无排序组织以Raft协议启动多个Orderer服务、TLS组织运行维护Orderer服务
  14. 使用JS实现对页面的繁体简体翻译转换
  15. 绿洲App更换logo 在App Store重新上架,苏宁活动又来了!没上车的快来
  16. SQL常用基础参考语句
  17. 山西内蒙古地区知名的调查研究咨询公司
  18. php date 加月_php如何使时间增加一个月
  19. 锐捷ac怎么发现局域网ap_锐捷AC配置步骤备忘
  20. 后端服务器常用软件:nginx

热门文章

  1. 大搜车孙信宇:一个好的团队应该去中心化
  2. Snapchat正挑战Facebook统治地位 激战短消息
  3. 破解word文件密码
  4. 防范网络黑产:黑账号威胁互联网业务安全
  5. finereport 帆软学习笔记--已解决的问题
  6. SpringBoot动态配置开启关闭定时任务
  7. AD 脚本kixtart运用之四(用户桌面背景)
  8. IOS小组件(4-2):创建可配置小组件(动态修改配置数据)
  9. 在centeros搭建workpress
  10. [凯立德]2013.12.17凯立德发布秋季版(2F21J0E)最新增量包SP1_我是亲民_新浪博客...