UPS电源下,自动关机,UPS电源,自动关机,停电后,在UPS电源下自
UPS电源下,自动关机,UPS电源,自动关机,停电后,在UPS电源下自
停电后,在UPS电源下自动关机
更新:有朋友说一个网络设备不可靠,增加一次ping多个网络设备,保障可靠性
hosts.list 格式:文本,每行一个ip地址
原理:ping一个未接入UPS电源的网络设备(路由网关),如果在设置的时间内ping不通,视为停电了
以下环境均测试过(window2003_64, MacOS10.7.4, ubuntu12.04_64,EXSi5.1)
用法:
sudo python ups_check.py once 192.168.1.1 30(需要配合crond)
sudo python ups_check.py forever 192.168.1.1 60(需要加入启动项)
sudo python ups_check.py once_multi hosts.list 30( 需要配合crond, 一次ping多个ip地址)
sudo python ups_check.py forever_multi hosts.list 60( 需要加入启动项, 一次ping多个ip地址 )
bash版本
import Queue, threading, subprocessimport re;import sys;import os;import struct;ping_cmd = "ping";ping_host = "192.168.2.1";ping_waittime = "-W 1";ping_count_flag = "-c";ping_result = "packets transmitted, (\\d+) .+"halt_cmd = "halt";def check_windows_and_python(): ok = -1; isX64 = 'PROGRAMFILES(X86)' in os.environ bits = struct.calcsize("P")*8; if isX64 == True and bits == 64: ok = 0; elif isX64 == False and bits == 32: ok = 0; if ok < 0: print("require", bits, "bits python for this system"); return ok;def check_platform() : ret = -1; osinfo = sys.platform; if osinfo.find("win32") != -1:#windows platform ret = check_windows_and_python(); if ret >= 0: global ping_waittime; global ping_count_flag; global ping_result; global halt_cmd; ping_waittime = "-w 1000"; ping_count_flag = "-n"; ping_result = "Received = (\\d+), Lost ="; halt_cmd = "shutdown -f -s -t 60" ret = 1; elif osinfo.find("darwin") != -1:#Mac OS X ret = 2; elif osinfo.find("linux2") != -1:#ubuntu EXSi ret = 3; if ret == -1: print("Unknown Platform: ", osinfo); return ret;def load_host_list(host_file): f = open(host_file); host_list = f.readlines(); return host_list;def ping_host_count(osinfo, host, c): ret = -1; ping_count = ' '.join([ping_count_flag, c]); if (osinfo == 1):#windows cmd_line = ' '.join([ping_cmd, ping_waittime, ping_count, host]); sub = subprocess.Popen(cmd_line, stdout=subprocess.PIPE); else:#other os system sub = subprocess.Popen([ping_cmd, ping_waittime, ping_count, host], stdout=subprocess.PIPE); output = sub.stdout.read().decode('utf-8'); grep = re.search(ping_result, output); sed = re.search("\\d+", grep.group()); ret = sed.group(0); missed = int(c) - int(ret); return missed;def ping_host_count_with_queue(osinfo, host, c, que): missed = 0; try: missed = ping_host_count(osinfo, host, str(c)); finally: que.put( (host, missed));#ping-multi hosts, return min(missed_in_hosts)def ping_multi_hosts(osinfo, hosts, c): min_missed = c; threads_count = len(hosts); que = Queue.Queue(); for host in hosts: ping_thread = threading.Thread(target = ping_host_count_with_queue, args = (osinfo, host, c, que, )) ping_thread.start(); while threads_count > 0: host, missed = que.get(); #print(host, missed); threads_count = threads_count - 1; if (min_missed > missed): min_missed = missed; return min_missed;#ping host oncedef ping_host_once(osinfo, host, time_out): missed = ping_host_count(osinfo, host, time_out); print("missed: ", missed); if(missed == int(time_out)): print("SYSTEM WILL HALT!!!"); subprocess.call(halt_cmd); return missed;#ping host foreverdef ping_host_forever(osinfo, host, time_out): ret = -1; total_missed = 0; count = 3; while True: missed = ping_host_count(osinfo, host, str(count)); if (missed == count): total_missed = total_missed + missed; else: total_missed = 0; if (total_missed >= int(time_out)): print("SYSTEM WILL HALT!!!"); subprocess.call(halt_cmd); ret = 0; break; return ret;#ping multi-hosts once def ping_multi_hosts_once(osinfo, host_file, time_out): ret = -1; host_list = load_host_list(host_file); min_missed = ping_multi_hosts(osinfo, host_list, int(time_out)); if(min_missed == int(time_out)): print("ping_multi_hosts timeout, SYSTEM WILL HALT!!!"); subprocess.call(halt_cmd); ret = 0; return ret;#ping multi-hosts forever def ping_multi_host_forever(osinfo, host_file, time_out): ret = -1; total_missed = 0; count = 3; host_list = load_host_list(host_file); while True: missed = ping_multi_hosts(osinfo, host_list, int(count)); if (missed == count): total_missed = total_missed + missed; else: total_missed = 0; if (total_missed >= int(time_out)): print("SYSTEM WILL HALT!!!"); subprocess.call(halt_cmd); ret = 0; break; return ret;def usage(): print("usage: sudo python hello.py [once|forever] 192.168.2.1 60"); print("usage: sudo python hello.py [once_multi|forever_multi] hosts.list 60"); print("host.list format: one ip / line");if __name__ == "__main__": if (len(sys.argv) >= 4): action = sys.argv[1]; host = sys.argv[2]; time_out = sys.argv[3]; ret = check_platform(); print("check_platform: ", ret); if (action == "once" and ret >= 0): ping_host_once(ret, host, time_out); elif (action == "forever" and ret >= 0): ping_host_forever(ret, host, time_out); elif (action == "once_multi" and ret >= 0): ping_multi_hosts_once(ret, host, time_out); elif (action == "forever_multi" and ret >= 0): ping_multi_host_forever(ret, host, time_out); else: usage(); else: usage();#该片段来自于http://byrx.net
评论关闭