停电自动关机

简介:

机房停电自动关机脚本, 机房有UPS,但只能撑30分钟吧, 


脚本指定时间去ping两台机器, 如果都超时,就开始关机


脚本放在 100.33 电脑中的VM里面


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/usr/bin/ruby
require  'net/ssh'
require  'net/telnet'
ip = [ "192.168.100.20" , "192.168.100.21" ]
list_srv =  '/root/machine.txt'
$hash  = {}
$log  ''
def  mailer(subject,main=subject)
msgstr = << END_OF_MESSAGE
From:  SVN  <svn @163 .com>
To: Bian <bian @163 .com>
Subject:  #{subject}
#{main}
END_OF_MESSAGE
         acct =  'svn@163.com'
         domain =  "163.com"
         pass =  'x3s2x2'
         begin
                 Net:: SMTP .start( 'smtp.163.com' 25 , domain, acct, pass,  :login ) { |smtp|
                                 smtp.send_message msgstr, 'svn@163.com' , 'bian@163.com'
                 }
         rescue
         end
end
def  check_alive(ip)
result = []
ip. each {|x| result << `ping  #{x} -c 4 | grep ttl | wc -l`.to_i }
return  result
end
def  close_win(whost,wuser,wpass)
whost ==  '192.168.100.33' ? time =  240  : time =  3
begin
      `net rpc shutdown -s -f -t  #{time} -I #{whost} -U #{wuser}%#{wpass}`
rescue
end
end
def  close_ubuntu(host,user,pass)
begin
         Net:: SSH .start(host, user,  :password  => pass) { |session|
                 session.open_channel { |channel|
                 channel.request_pty
                 channel.exec( "sync; sync; sync; sudo -p 'Password' init 0" ) { |ch, success|
                         abort  "could not execute command"  unless  success
                 channel.on_data { |ch, data|     #result
                         if  data =~ /Password/
                                 channel.send_data(pass +  "\n" )
                         end
                 }
                 }
                 }
                 #session.loop
         }
rescue
end
end
def  close_centos(ip,user,pass)
begin
         Net:: SSH .start(ip, user,  :password  => pass) {|ssh|
         ssh.exec!( "sync; sync; sync; init 0" )
         }
rescue
end
end
def  close_vm(ip,user,pass,type,vm_name)
         if  type ==  "vm"
                 cmd =  "sync; sync; sync; halt"
         else
                 cmd = "esxcli vm process kill --type=soft --world-id=`esxcli vm process list |
                                 grep - A  1  - E  '^#{vm_name}'  | tail - 1  | awk  '{print $3}' `"
         end
begin
         Net:: SSH .start(ip, user,  :password  => pass) {|ssh|
         ssh.exec!( "#{cmd}" )
         }
rescue
end
end
def      drbd(ip,user,pass)  #check DRBD Pri or Sec
begin
         Net:: SSH .start(ip, user,  :password  => pass ) { |ssh|
         result = ssh.exec!( "ip a | grep '192.168.100.50' | wc -l" )
         return  result.to_i
     }
rescue
end
end
def  close(type)
$hash . each  { |x,y|
         if  y[ 3 ].strip == type
         case  y[ 2 ].strip
                 when  'win'
                         close_win(x.strip, y[ 0 ].strip, y[ 1 ].strip)
                 when  'centos'
                         close_centos(x.strip, y[ 0 ].strip, y[ 1 ].strip)
                 when  'ubuntu'
                         if  type ==  'c'
                                 if  drbd(x.strip, y[ 0 ].strip, y[ 1 ].strip) ==  1  #DRBD is Pri
                                         redo
                                 else
                                         close_ubuntu(x.strip, y[ 0 ].strip, y[ 1 ].strip)
                                 end
                         else
                                 close_ubuntu(x.strip, y[ 0 ].strip, y[ 1 ].strip)
                         end
                 when  'vm'
                         if  type ==  'a'
                                 close_vm(x.strip, y[ 0 ].strip, y[ 1 ].strip,  "srv" "BeiJingHWA" )
                         elsif  type ==  'b'
                                 close_vm(x.strip, y[ 0 ].strip, y[ 1 ].strip,  "srv" "Panabit" )
                         else
                                 close_vm(x.strip, y[ 0 ].strip, y[ 1 ].strip, "vm" "" )
                         end
                 end
         sleep  3
         end
}
end
def  check(type)
         $hash . each  {|x,y|
                 if  y[ 3 ].strip == type
                         begin
                                 Net::Telnet: :new ( "Host"  => x.strip, "Port"  => y[ 4 ].strip.to_i,  "Telnetmode"  =>  false )
                                 $log  $log  "#{x.strip} is PowerON "  Time .now.strftime( "%Y-%m-%d %k:%M" )
                         rescue
                                 $log  $log  "#{x.strip} is PowerOFF "  Time .now.strftime( "%Y-%m-%d %k:%M" )
                         end
                 end
         }
end
def  log(str)
aFile =  File . new ( Dir .pwd +  Time .now.strftime( "%Y-%m-%d" ) +  ".log" , "w" )
        aFile.puts str
aFile.close
end
#============== start close server
File .open(list_srv, 'r' ). each  {|x|
         $hash [x.split( ',' )[ 0 ]] = [x.split( ',' )[ 1 ], x.split( ',' )[ 2 ], x.split( ',' )[ 3 ], x.split( ',' )[ 4 ], x.split( ',' )[ 5 ]]
         #ip,user,pass,os_type,close_type,check_port
}
loop  do
result = check_alive(ip)
         if  (result[ 0 ] ==  0 ) && (result[ 1 ] ==  0 )
                 mailer( "Power Notice" "Abnormal power" )
                 break
         elsif  (result[ 0 ] ==  0 ) || (result[ 1 ] ==  0 )
                 mailer( "Device Err" "One Device Maybe Down" )
                 Process.exit( 0 )
         end
         sleep  40
end
#first
close( 'a' )
sleep  120
check( 'a' )
#second
close( 'b' )
sleep  30
check( 'b' )
#third
close( 'c' )
sleep  180
check( 'c' )
#vm
close( 'd' )
sleep  60
check( 'd' )
log( $log )
sleep  5
#close vcenter
close_win( "192.168.100.33" $hash [ '192.168.100.33' ][ 0 ],  $hash [ '192.168.100.33' ][ 1 ])
exec( 'sync; sync; sync; init 0' )



本文转自 nonono11 51CTO博客,原文链接:http://blog.51cto.com/abian/1344957,如需转载请自行联系原作者
相关文章
|
5月前
|
运维 Windows
[故障处理]WindowsServer休眠后黑屏
[故障处理]WindowsServer休眠后黑屏
116 0
|
Windows
电脑硬件出现故障如何去修理?
电脑硬件出现故障如何去修理?
|
8月前
|
监控 安全 芯片
按键开关机的锂电池充放电解决方案
一、产品概述 TP4562 是一款集成线性充电管理、同步升压转换、电池电量指示和多种保护功能的单芯片电源管理SOC,为锂电池的充放电提供完整的单芯片电源解决方案。 TP4562 内部集成了线性充电管理模块、同步升压放电管理模块、电量检测与 LED 指示模块、保护模块、按键模块和自动关机模块。TP4562 内置充电与放电功率 MOS,充电电流为 250mA,最大同步升压输出电流为 500mA。 TP4562 采用专利的充电电流自适应技术,同时采用专利的控制方式省去外部的功率设定电阻,降低功耗的同时降低系统成本。 TP4562 内部集成了温度补偿、过温保护、过充与过放保护输出过压保护、输出
|
8月前
|
存储 自动驾驶 人机交互
计算机操作系统-第三天
计算机操作系统-第三天
H3C服务器红灯故障解决方案
H3C服务器红灯故障解决方案
369 0
笔记本电脑电池显示 4% 可用(已接通电源),经过清灰又莫名奇妙的可以续航啦,很奇怪!
在此记录一下这个奇葩的事情。不然就只能换电池了。这个电脑用了起码 5 年,电池是有使用期限的,定期更换可能更好
436 0
Win系统 - 电池续航越来越短?自带工具一秒揪出耗电应用
Win系统 - 电池续航越来越短?自带工具一秒揪出耗电应用
380 0
Win系统 - 电池续航越来越短?自带工具一秒揪出耗电应用
|
Windows
Win系统 - 更新卡太久,我能不能强制关机?(上)
Win系统 - 更新卡太久,我能不能强制关机?(上)
321 0
Win系统 - 更新卡太久,我能不能强制关机?(上)
Win系统 - 更新卡太久,我能不能强制关机?(下)
Win系统 - 更新卡太久,我能不能强制关机?(下)
134 0
Win系统 - 更新卡太久,我能不能强制关机?(下)
|
存储 安全
瞬间烧焦你的电脑,这是一个能摧毁所有设备的 U 盘
能瞬间烧毁几乎任何电脑的 U 盘现在真的能买到了,这款产品叫做 USB Killer,能够通过 USB 电源线快速收集电量,反复向主机放 240V 高压直至主机死亡,可怕的是,整个过程仅需几秒。
286 0
瞬间烧焦你的电脑,这是一个能摧毁所有设备的 U 盘