Perl脚本实现检测主机心跳信号功能

时间:2022-10-08 19:10:50

使用串口通信,在备机端使用如下脚本检测来自主机的心跳信号,一旦未接受次数超过指定记数,备机认为主机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 ;