H3C和Cisco的无线设备自动监测和重启

背景:
前一段时间公司的购置了一批企业级的无线AP,由于使用人数太多,运行一段时间后发现,无线还是经常掉线或者无法连上网络(有线不会出现这样的问题),这时候我们会对无线设备进行重启,重启之后设备恢复正常,无线网络也恢复ok,由此萌生想用自动化的方式对无线设备进行监控和自动定期对无线设备重启来保持无线网络的稳定。

无线设备型号H3C WA2620i-AGN 和 Cisco Aironet 1240AG

目的:
1.自动监测无线设备的运行情况,当监测到无线设备不能连接到外网或者延迟很高时,重启无线设备。

2.每天中午12:30和下午18:30 定期对无线设备进行重启

思路:
核心就是模拟手工登陆无线设备,运行相关无线设备的命令,去判断无线设备的运行情况,来实现自动监测和重启,核心方式使用shell的expect函数,为什么使用shell,而不使用其他语言比如python,是因为它能快速的完成这个功能。

上图-> 自动重启无线设备图(H3C和Cisco

上图-> 自动监测无线设备图(H3C和Cisco
)–>丢包正常图(模拟登陆无线设备ping外网地址,延迟正常则无需重启等动作)

[Cisco]

[]

[[H3C**]

[[**]

[[\
**]

上图-> 自动监测无线设备图(H3C和Cisco
)–>丢包不正常图(模拟登陆无线设备ping外网地址,延迟不正常则需重启)

[Cisco]

\

[H3C]

[]

[]

[代码如下:]

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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#!/bin/bash
#author: GaoMing
#date: 2015-11-02
#qq: 530035210
#blog: http://my.oschina.net/pwd/blog 
# 无线设备定期重启和自动监测
 
logdir=/data/log/shell          #日志路径
log=$logdir/log.log            #日志文件 
is_font=1                #终端是否打印日志: 1打印 0不打印 
is_log=1                 #是否记录日志: 1记录 0不记录
pingDes="223.5.5.5"
#pingDes="8.8.8.8"
datef(){
date "+%Y-%m-%d %H:%M:%S"
}
  
print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo -e "[ $(datef) ] $1"
fi
}
#H3C无线自动执行命令
#$1:无线IP,$2:无线账号,$3:无线密码,$4:要执行的命令 
runH3C()
{
         expect -c "
                spawn /usr/bin/telnet  $1  23
                set timeout -1
                expect \"\*Username\*:\"
                send \"$2\r\"
expect \"\*Password\*:\"
                send \"$3\r\"
                expect \"\*\>\"
                send \"$4 \r\"
                expect \"\*\>\"
                send \"quit\r\"
                expect eof 
                  "
}
#H3c无线重启
runH3cReboot()
{
         expect -c "
                spawn /usr/bin/telnet  $1  23
                set timeout -1
                expect \"\*Username\*:\"
                send \"$2\r\"
                expect \"\*Password\*:\"
                send \"$3\r\"
                expect \"\*\>\"
                send \"$4 \r\"
                expect \"\*\:\"
                send \"Y\r\"
                expect eof 
                  "
}
#Cisco无线自动执行命令
#$1:无线IP,$2:无线账号,$3:无线密码,$4:要执行的命令
runCisco()
{
         expect -c "
                spawn /usr/bin/telnet  $1  23
                set timeout -1
                expect \"\*Username\*:\"
                send \"$2\r\"
                expect \"\*Password\*:\"
                send \"$3\r\"
                expect \"\*\#\"
                send \"$4 \r\"
                expect \"\*\#\"
                send \"quit\r\"
                expect eof 
                  "
}
#Cisco无线重启
runCiscoReload()
{
         expect -c "
                spawn /usr/bin/telnet  $1  23
                set timeout -1
                expect \"\*Username\*:\"
                send \"$2\r\"
                expect \"\*Password\*:\"
                send \"$3\r\"
                expect \"\*\#\"
                send \"$4 \r\"
                expect \"\*\]\"
                send \"\r\"
                expect eof 
                  "
}
#整合H3C和Cisco无线自动执行
#$1:无线设备类型 $2:无线IP,$3:无线账号,$4:无线密码,$5:要执行的命令
runWirelessAction()
{
print_log "\t-----Start-----"
int=1
while (( $int <= $# ))
do
eval i=\$$int
if [[ $i == ""    ]];then
print_log "$FUNCNAME():参数(第$int个)为空,退出."
exit
fi
let "int++"
done
print_log "$FUNCNAME():检测IP($3)($2)是否存在..."
pingIP=$(ping -c 3 $3  |grep "3 received" |wc -l)
if [[ $pingIP -eq 0  ]];then
print_log "$FUNCNAME():$3无线的IP不存在或者宕机了,退出当前函数."
return
else
print_log "$FUNCNAME():检测IP完成."
fi
case $1 in
"restart")
    case $2 in
        "cisco")
         print_log "$FUNCNAME():开始重启无线思科设备..."
         reloadStr=$(runCiscoReload "$3" "$4" "$5" "$6")
         reloadStrResult=$(echo "$reloadStr"|grep "closed" |wc -l)
         if [[ $reloadStrResult -eq 1  ]];then
         print_log "$FUNCNAME(): IP为:$3的无线设备正在重启..."
         print_log "$FUNCNAME(): 设备返回的信息如下:\n\r$reloadStr"
         else
         print_log "$FUNCNAME(): IP为:$3的无线设备重启异常 \n\r return code:$reloadStrResult \n\r return Str:$reloadStr"
         fi
         print_log "$FUNCNAME():重启无线思科设备完成"
        ;;
        "h3c")
                print_log "$FUNCNAME():开始重启无线H3c设备..."
         runH3cReboot  "$3" "$4" "$5" "$6" > /tmp/rebootStr.txt &
         sleep 5
         rebootStr=$(cat /tmp/rebootStr.txt)
                rebootStrResult=$(cat /tmp/rebootStr.txt|grep "Continue" |wc -l)
                if [[ $rebootStrResult -eq 1  ]];then
                        print_log "$FUNCNAME(): IP为:$3的无线设备正在重启..."
                        print_log "$FUNCNAME(): 设备返回的信息如下:\n\r$rebootStr"
                else
                        print_log "$FUNCNAME(): IP为:$3的无线设备重启异常 \n\r return code:$rebootStrResult \n\r return Str:$rebootStr"
                fi
                print_log "$FUNCNAME():重启无线H3c设备完成"
        ;;
        *)
        print_log "$FUNCNAME():暂不支持其他设备."
        ;;
    esac
;;
"run")
case $2 in
   "cisco")
print_log "$FUNCNAME():开始操作无线思科设备($3)..."
        print_log "$FUNCNAME():开始在该设备执行命令($6)..."
         runReStr=$(runCisco "$3" "$4" "$5" "$6")
returnPercent=$(echo $runReStr |grep "percent" |awk -F'percent' '{print $1}' |awk '{ print $NF}')
print_log "$FUNCNAME():设备返回的信息如下:\n\r $runReStr"
print_log "$FUNCNAME():ping包返回的成功百分比(5个包): $returnPercent%"
if [[ $returnPercent -lt 50  ]];then
print_log "$FUNCNAME():该无线设备的丢包率大于50%,开始重启该设备."
runWirelessAction "restart" "cisco" "$3" "$4" "$5" "reload"
fi 
         print_log "$FUNCNAME():执行命令完成"
;;
   "h3c")
print_log "$FUNCNAME():开始操作H3c设备($3)..."
        print_log "$FUNCNAME():开始在该设备执行命令($6)..."
         runReStr=$(runH3C "$3" "$4" "$5" "$6")
returnPercent=$(echo "$runReStr" |grep "loss" |awk -F'.' '{print $1}')
print_log "$FUNCNAME():ping包的丢包率(5个包):$returnPercent%"
print_log "$FUNCNAME():设备返回的信息如下:\n\r $runReStr"
if [[ $returnPercent -gt 50  ]];then
print_log "$FUNCNAME():该无线设备的丢包率大于50%,开始重启该设备."
runWirelessAction "restart" "h3c" "$3" "$4" "$5" "reboot"
fi 
         print_log "$FUNCNAME():执行命令完成"
;;
esac
;;
*)
print_log "$FUNCNAME():暂不支持其他类型无线AP或参数."
;;
esac
}
#自动监测和重启
#runWirelessAction "run" "cisco" "10.2.1.111" "admin" "password" "ping $pingDes"
#runWirelessAction "run" "h3c" "10.2.1.112" "admin" "password" "ping $pingDes"
#重启
#runWirelessAction "restart" "cisco" "10.2.1.111" "admin" "password" "reload"
#runWirelessAction "restart" "h3c" "10.2.1.111" "admin" "password" "reboot"

[] 自动监测和定期重启直接加入crontab即可使用

坚持原创技术分享,您的支持将鼓励我继续创作!