使用串口通信,在备机端使用如下脚本检测来自主机的心跳信号,一旦未接受次数超过指定记数,备机认为主机DOWN机,自动设置为主机的网络参数,顶替主机提供服务。
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
|
# ! perl -w use strict; use Win32 :: SerialPort; my $port = ' COM2 ' ; # serail port name registried in OS my $count = 0 ; # count number of heartbeat-receiving failture my $max_count = 5 ; # max fail count to be tolerated my $interface = ' # ---------------------------------- # 接口 IP 配置 # ---------------------------------- pushd interface ip # "local" 的接口 IP 配置 set address name= "local" source=static addr=192.168.6.185 mask=255.255.255.0 set address name= "local" gateway=192.168.6.65 gwmetric=0 set dns name= "local" source=static addr=192.168.6.112 register=PRIMARY add dns name= "local" addr=192.168.6.201 index =2 set wins name= "local" source=static addr=none popd # 接口 IP 配置结束 ' ; # net inetrface config information sub errlog { # log the failtrue occuring time open ERR , ' >>err.log ' ; my @time = localtime (); my $time = sprintf ( " %d " , $time [ 5 ] + 1900 ) . ' - ' . sprintf ( " %d " , $time [ 4 ] + 1 ) . ' - ' . " $time[3] " . ' ' . sprintf ( " %.2d " , $time [ 2 ]) . ' : ' . sprintf ( " %.2d " , $time [ 1 ]) . ' : ' . sprintf ( " %.2d " , $time [ 0 ]); print ERR $time . " \n " ; close ERR; } sub ipchange { # change ip addrress open TMP , ' >tmp ' ; print TMP $interface ; close TMP; eval { system ' netsh -f tmp ' ; unlink ' tmp ' ; }; if ($@) { return 0 ;} return 1 ; } my $ob = Win32 :: SerialPort -> new( $port ) or die " CANNOT OPEN $port " ; # open serial port eval { # set serial port properties $ob -> baudrate( 9600 ); $ob -> parity( ' none ' ); $ob -> databits( 8 ); $ob -> stopbits( 1 ); $ob -> handshake( ' none ' ); }; if ($@) { die ' SET FAILED ' ;} $ob -> write_settings or die " CANNOT WRITE $port DRIVER " ; # write to port driver to make it active while ( 1 ) { # loop receiving heartbeat from remote machine # change ip address after designated count of failture my ( $length , $result ) = $ob -> read ( 10 ); if ( $result ) { $count = 0 ; } elsif ( $count == $max_count ) { errlog(); if (not ipchange()) { print ' IP CHANGE FAILED ' ; } last ; } else { $count ++ ; } sleep ( 1 ); } undef $ob ; |