问题描述
我瓜西北工业大学长安校区内开通了WiFi全覆盖,其中NWPU-FREE
无需账号登录,可以用于实验区中小计算集群联网。
用户可以在宿舍、学院楼ssh登录小计算集群。
当然,也可以从校外使用VPN进入校内网络,进而连接这些小集群。
但是存在一个非常不方便的问题:
校园网采用DHCP方式分配IP。
在一个不确定的时间间隔后,小集群的WiFi连接会断开(此时WiFi保持了“虚假”的连接),IP有时候也会变。
解决方案
一种方式是向学校的信息中心申请分配静态IP,保证连接后IP不变。但很有可能WiFi还会出现假连接真断开的情况。
另一种方式是写一个shell脚本,自动检测WiFi是否真的连接,如果已经断开,则自动重连并发送新IP到指定邮箱。 具体如下。
首先设定crontab
,每隔1小时执行脚本,检测WiFi并自动重连。
1 * * * * /usr/bin/bash /path/to/auto_connect_wifi.sh
auto_connect_wifi.sh
的内容如下:
#!/bin/bash
# Gateway/DHCP server
dhcp_server=10.27.0.1
wifi_name="NWPU-FREE"
nic_name="wlp2s0u2"
test_website="baidu.com"
#
ping_ret=$(ping -c 5 ${dhcp_server} | tail -n 2 | sed -n '1p' | awk '{print $4}')
if [ "$ping_ret" == "" ]; then
nmcli d wifi connect ${wifi_name} ifname ${nic_name}
sleep 10
ping -c 5 ${test_website}
bash /path/to/send_ip.sh
elif [ "$ping_ret" == "0" ]; then
# ping fails
echo "$(date): WiFi disconnected!"
nmcli d wifi connect ${wifi_name} ifname ${nic_name}
sleep 10
ping -c 5 ${test_website}
bash /path/to/send_ip.sh
fi
send_ip.sh
使用了Mailgun的Email API服务自动发送新IP到指定邮箱,脚本内容如下:
ip_str=$(hostname -I | awk '{print $1}')
ip_f1_name="old_ip.txt"
ip_f2_name="current_ip.txt"
old_ip=$(cat ${ip_f2_name})
if [ "${old_ip}" != "${ip_str}" ]; then
my_domain_name=YOUR_MAILGUN_DOMAIN_NAME
receiver_mail="SECOND_EMAIL_ADDRESS"
curl -s --user 'api:YOUR_API_KEY' \
https://api.mailgun.net/v3/${my_domain_name}/messages \
-F from="Cluster notification<mailgun@${my_domain_name}>" \
-F to=${receiver_mail} \
-F to="FIRST_EMAIL_ADDRESS" \
-F subject='The cluster IP is changed!' \
-F text="The new IP is ${ip_str}"
cat ${ip_f2_name} >> ${ip_f1_name}
echo "${ip_str}" > ${ip_f2_name}
fi